#cpp #шаблоны_с++
Основной вопрос в заголовке, идея в ограничении доступа к методу своего класса: С::serialize(). (код сильно сокращён) class Type1 { public: templateType& 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); template friend T& class T::operator&(C); template friend T& T::operator& < T > (class C); ни один вариант не прокатывает.
Ответы
Ответ 1
Не уверен, что сделать именно так вообще возможно. Если бы такое было возможно, то компилятору бы пришлось прочёсывать все классы в поисках метода. Но утверждать, что так нельзя не буду — нет доказательств. Т.к. задача не совсем ясна, то я могу предложить следующее решение: class C { int v = 10; templatefriend 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. Сложно сказать, насколько это поможет Вам, т.к. повторюсь — Ваша задача не совсем ясна.
Комментариев нет:
Отправить комментарий