【问题标题】:How can a class declare all of its variadic template parameters friends?一个类如何声明它所有的可变参数模板参数?
【发布时间】:2013-11-23 23:08:54
【问题描述】:

如果我有一个接受可变参数包模板参数的类,我如何将它们全部声明为朋友?

这是我想以伪代码形式执行的操作:

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;
    }
};

【问题讨论】:

  • passkey(C++11 allow 版本)可能比交友更好。

标签: c++ metaprogramming variadic-templates


【解决方案1】:

这只能使用“编译时递归”来完成,就像元组一样。要点是(我现在在一台小型笔记本电脑上,根本无法舒适地打字):

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&lt;&gt; class object&lt;&gt; {}; 作为结束递归的那个(我在 1 个模板参数中使用 object 终止它)

(感谢 Dietmar Kuhl 的格式化)

【讨论】:

  • 我认为终止案例“template class object”需要将以前的私有部分(在这种情况下为“privateInt”)作为受保护的成员,以便所有朋友都可以访问它.做出改变,我会接受。
  • 这与任何可编译的东西相去甚远,以至于六年后我不得不对其投反对票。
  • @Peter 原谅我的 cmets,如果你只是拼命地复制和粘贴并希望它编译;)
  • @peter 任何写模板 class thing的人都应该被枪决。
  • 奇怪的是,我对 @Peter 的评论很棒(它确实激发了敬畏)当后面跟着一行/一个语句时不理解“template class object {”,然后是“};”这比产生这些变化的差异要长,但不知何故消失了。祝彼得好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多