Как класс может объявить всех своих параметров шаблона variadic друзьями?

0

Если у меня есть класс, который принимает variadic pack аргументов шаблона, как я могу объявить их друзьями?

Вот что я хотел бы сделать в псевдокодовой форме:

template<typename... Ts>
class AbstractMyClass {
    int privateInt;
    friend Ts...;
};
class OtherClass;
using MyClass = AbstractMyClass<OtherClass>;

class OtherClass {
public:
    void foo(MyClass &c){
        c.privateInt = 42;
    }
};
  • 1
    Лучшая идея , чем friending может быть ключ доступа (С ++ 11 allow версию).
Теги:
variadic-templates
metaprogramming

1 ответ

0

Это можно сделать только с помощью "репликации времени компиляции", как и кортежи. Суть заключается в том, что я сейчас на маленьком ноутбуке и ни в коем случае не могу комфортно печатать:

template<class .... THINGS> class object;

template<class T> class object {
    friend T;
};

template<class T,class ... THINGS>
class object: public object<THINGS> {
    friend T;
};

Если C++ не нравится, попробуйте template<> class object<> {}; как тот, который заканчивает рекурсию (я завершаю ее object в 1 шаблонном параметре)

(Спасибо Dietmar Kuhl за форматирование)

  • 0
    Я думаю, что в случае завершения «template <class T> class object» необходимо сохранить ранее закрытый раздел (в данном случае «privateInt») как защищенный член, чтобы все друзья могли получить к нему доступ. Сделайте это изменение, и я приму.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню