Страницы

Поиск по вопросам

среда, 13 марта 2019 г.

Как сделать конкретный метод любого класса другом моего класса?

Основной вопрос в заголовке, идея в ограничении доступа к методу своего класса: С::serialize(). (код сильно сокращён)
class Type1 { public: template Type& operator&(T t){t.serialize(*this);return *this;} template<>Type& operator&(int t){/*полезные действия*/return *this;} };
class Type2 { public: template Type& operator&(T t){t.serialize(*this);return *this;} template<>Type& operator&(int t){/*полезные действия*/return *this;} };
class C { int v;
template friend T& T::operator&(C); template T& serialize(T&t){t&v; return t;} public: ... };
//------------------------------------------------------------------------------ int _tmain(int argc, _TCHAR* argv[])// { Type t; C c; t & c & c & c; return 0; }
Задача - правильно написать friend. Вызывать метод С::serialize из оператора Type::operator&() Классов Type будет неопределённое количество.
template friend class T; friend Type& Type::operator&(class C); friend Type& operator&(class Type,class C); templatefriend T& class T::operator&(C); template friend T& T::operator& < T > (class C);
ни один вариант не прокатывает.


Ответ

Не уверен, что сделать именно так вообще возможно. Если бы такое было возможно, то компилятору бы пришлось прочёсывать все классы в поисках метода. Но утверждать, что так нельзя не буду — нет доказательств.
Т.к. задача не совсем ясна, то я могу предложить следующее решение:
class C { int v = 10;
template friend T& operator&(T&, const C&); template T& serialize(T&t) const { t&v; return t; } };
template T& operator&(T& t, const C& c) { c.serialize(t); return t; }
class Type1 { public: Type1& operator&(int t) {/*полезные действия*/return *this; } };
class Type2 { public: Type2& operator&(int t) {/*полезные действия*/return *this; } };
Как Вы можете видеть, я вынес операторы из Ваших Type# классов в один общий, и сделал эту функцию другом C. Сложно сказать, насколько это поможет Вам, т.к. повторюсь — Ваша задача не совсем ясна.

Комментариев нет:

Отправить комментарий