Страницы

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

четверг, 23 января 2020 г.

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

#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; 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. Сложно сказать, насколько это поможет Вам, т.к. повторюсь — Ваша задача не совсем ясна.

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

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