TGViewer
C++ Moscow C++ Moscow @cppmoscow_info · 448 subscribers
Post #104 1.77K
Интересный пример, когда объявление friend T (где T — шаблонный параметр) имеет смысл:

template <typename T>
class Badge {
friend T;
Badge() { }
};


Допустим, у нас есть какой-нибудь публичный метод, и предполагается, что круг его пользователей ограничен лишь одним классом, например:

class VFS {
...
public:
void register_device(Device&);
void unregister_device(Device&);
};


Предполагается, что эти методы будут вызываться внутри конструкторов (и деструкторов соответственно) Device и нигде (и никем) больше. Но как закрепить наше ожидание на уровне API? Сейчас эти методы может вызывать каждый.

Распространенное решение — вынести (un)register_device в приватную часть, а Device объявить дружественным:

class VFS {
...
private:
friend class Device;
void register_device(Device&);
void unregister_device(Device&);
};


И это действительно запрещает всем кроме Device обращаться к данным методам. Но это так же разрешает Device обращаться ко всем остальным приватным членам VFS! Кажется, будто мы позволяем ему слишком многое.

Выразить же желаемое наиболее четко и ясно нам помогает как раз таки класс Badge, приведенный в самом начале статьи: мы можем оставить методы (un)register_device в публичной части, но при этом сделать их первым аргументом значение Badge<Device>:

class VFS {
...
public:
void register_device(Badge<Device>, Device&);
void unregister_device(Badge<Device>, Device&);
};


Теперь чужак не может использовать эти методы, потому что он не может сконструировать Badge<Device> (его конструктор приватный и доступен только Device), а сам Device может вызывать их где и как пожелает:

Device::Device()
{
VFS::instance().register_device({}, *this);
}
  • 🔥 16
  • 👍 3
More from @cppmoscow_info
  1. Aug 11, 2024#article #original Реализуем эффективный тупль с помощью C++26 Свет видел много любительск…
  2. Jun 2, 2024#обсуждение Вечернее обсуждение. Пост от @eoanermine Кажется, будто C++ идёт не в том напр…
  3. Mar 1, 2024Спасибо всем зарегистрировавшимся, и до скорой встречи! Нам хотелось бы собрать как можно…
  4. Feb 27, 202420 марта: C++ митап в Петербурге и онлайне Нас ждет классический вечерний бесплатный митап…
  5. Feb 27, 2024Пока мы проводим митапы в Москве, наши коллеги из YADRO планируют митап в Санкт–Петербурге…
  6. Feb 18, 2024#meetup Первый неформальный митап C++ Moscow пройдет 3 марта (Вс) с 15:00 до 17:00–18:00 в…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →