#cpp #шаблоны_с++
Основной вопрос в заголовке, идея в ограничении доступа к методу своего класса: С::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);
ни один вариант не прокатывает.
Ответы
Ответ 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. Сложно сказать, насколько это поможет Вам, т.к. повторюсь — Ваша задача не совсем ясна.
Комментариев нет:
Отправить комментарий