Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
AG>>PS: AG>>— What is the purpose of the friend keyword? AG>>— To do the Barton-Nackman trick! E>Классная трактовка!!! E>Хотя я знаю ещё одно относительно полезное применение :)
1. friend class boost::iterator_core_access;
2. Трюки с POI, позволяющие сделать самодельный decltype с помощью непортабельных хаков;
3. friend std::ostream& operator << (для упрощения ADL).
Здравствуйте, Alexander G, Вы писали:
E>>Хотя я знаю ещё одно относительно полезное применение AG>Заинтриговал. Рассказывай
Ну всякие относительно полезные применения, которые я знаю, чем-то похожи на Barton-Nackman hack.
Но я знаю непохожее, только не знаю, как назвать. Когда доступ предоставляют только определённому классу и к определённым членам другого класса.
Общая идея такая, заводим хитрый класс-аксессор, который друг, но доступ имеет только к конкретным местам, но к интерфейсу самого аксессора имеют доступ только его друзья...
Ну типа:
class B;
class A {
public:
class Accessor;
private:
void method1();
void method2();
void method3();
};
class A::Accessor {
friend B; // Ему можноstatic callMethod2( A* a ) { a->method2(); } // Но только это
};
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Roman Odaisky, Вы писали:
E>>Хотя я знаю ещё одно относительно полезное применение
RO>1. friend class boost::iterator_core_access;
Я бы обобщил — предоставление реализации CRTP-базе с сохранением инкапсуляции. В WTL такое тоже делается.
RO>2. Трюки с POI, позволяющие сделать самодельный decltype с помощью непортабельных хаков;
Не знаю может BOOST_TYPEOF использует это же.
RO>3. friend std::ostream& operator << (для упрощения ADL).
Про упрощение ADL не понял. Но friend может быть нужен, если требуется non-member оператор, имеющий доступ к деталям реализации.
RO>Что еще?
Всё самое интересное — таки связано с нешаблонными инлайновыми друзьями шаблонных классов. Вот использую я Boost.Iterator, но объявления friend class boost::iterator_core_access; нет — все advance, distance, etc — открытые, я не вижу в этом большой проблемы. А для intrusive_ptr_add_ref/intrusive_ptr_release кейворд friend действительно полезен.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском