Если у меня есть класс, который принимает 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;
}
};
Это можно сделать только с помощью "репликации времени компиляции", как и кортежи. Суть заключается в том, что я сейчас на маленьком ноутбуке и ни в коем случае не могу комфортно печатать:
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 за форматирование)
allow
версию).