применение friend
От: Erop Россия  
Дата: 21.01.09 12:27
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>PS:

AG>

AG>- What is the purpose of the friend keyword?

AG>- To do the Barton-Nackman trick!

Классная трактовка!!!

Хотя я знаю ещё одно относительно полезное применение

22.01.09 18:46: Ветка выделена из темы Вопросы из Brainbench C++
Автор: XFREE86
Дата: 21.01.09
— Кодт
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: применение friend
От: Alexander G Украина  
Дата: 21.01.09 15:48
Оценка:
Здравствуйте, Erop, Вы писали:

E>Хотя я знаю ещё одно относительно полезное применение


Заинтриговал. Рассказывай
Русский военный корабль идёт ко дну!
Re: применение friend
От: Roman Odaisky Украина  
Дата: 21.01.09 17:48
Оценка:
Здравствуйте, 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).

Что еще?
До последнего не верил в пирамиду Лебедева.
Re[2]: применение friend
От: Erop Россия  
Дата: 21.01.09 19:01
Оценка: 8 (2)
Здравствуйте, 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(); } // Но только это
};
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: применение friend
От: Alexander G Украина  
Дата: 22.01.09 20:17
Оценка:
Здравствуйте, 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 действительно полезен.
Русский военный корабль идёт ко дну!
Re: Вот ещё одно: ImtRange... :)
От: Erop Россия  
Дата: 22.01.09 20:43
Оценка:
Здравствуйте, Erop, Вы писали:

Вот ещё один симатишный вариант Barton-Nackman хака: IntRange
Автор: Erop
Дата: 29.04.08
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.