【问题标题】:Friend with a certain template class : "template<ANY...> friend class A;"具有特定模板类的朋友:“template<ANY...> 朋友类 A;”
【发布时间】:2017-05-21 04:00:14
【问题描述】:

有没有办法以通配符的方式用模板类声明朋友?

示例

我总是这样声明朋友:-

//B.h
template<class T1,class T2>class B{}; 
//C.h
class C{                              
    template<class,class> friend class B;
};

但是,如果 B 模板参数发生更改,我将不得不更新 C,这通常是一个相距甚远的标题。

//B.h
template<int T3,class T1,class T2>class B{}; 
//C.h
class C{                              
    template<int,class,class> friend class B;  //<-- manually update here too
};

它会导致轻微的可维护性问题。 (对我来说,每周一次。)

问题

我可以这样做吗?

class C{                              
    template<ANY...> friend class B; 
};

这是不可能的吗?

我隐隐觉得这个问题可能是重复的,因为这可能是一个常见的问题。
但是,我找不到。

【问题讨论】:

  • 你指的是variadic class template吗?
  • @codekaizer 是的。我也试过了。它仅在某些情况下有效。
  • @codeKaizer 仍然 OP 需要在相应的“C”类中用他需要的东西进行实例化
  • 如果您必须经常更改 B 的模板参数,也许您应该考虑使用可变参数包对其进行模板化?这可能会更好地概括您的代码,并且可以通过template &lt;typename... Args&gt; friend class B 轻松地与它成为朋友,如果您想访问参数包中的特定类型,您可以使用std::tuple_element_t&lt;0, std::tuple&lt;Args...&gt;&gt;,可以将其设为别名以便于使用. template &lt;int Index&gt; using TypeAtIndex = std::tuple_element&lt;Index, std::tuple&lt;Args...&gt;&gt;
  • @Curious 这是一个绝望的措施。我认为这对我来说不值得,但谢谢。

标签: c++ templates c++14 friend


【解决方案1】:

这是一种方法:

// declare the concept of a variadic B
template<class...Ts> struct B;


struct C
{
    private:

    // any B with any number of Types is a friend
    template<class...Ts> friend struct B;

    void privateThing() {};
};


// now specialise B <T1, T2>
template<class T1, class T2> struct B<T1, T2> {

    void foo(C& c) {
        c.privateThing();
    }

};

int main()
{
    C c;
    B<int, double> b;
    b.foo(c);
}

【讨论】:

  • 我无法让它为 B&lt;int,class,class&gt; 工作。 coliru.stacked-crooked.com/a/4f909942d192f39e我错过了什么吗? (感谢您的回答。在其他情况下会很方便。)
  • @javaLover 不幸的是,非类型模板参数不能被视为类型参数。我认为您不会在那里找到解决方法...
  • @W.F.这将帮助我停止浪费时间搜索,谢谢!如果您足够确定,您可以发布另一种解决方案。 XD
  • @javaLover 我会尝试,但我不确定我是否能成功,因为我今天没有太多时间(而且 不能答案总是比解决方法花费更多的时间:))
  • 你可以使用 std::integral_value 将非类型转换为类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2011-10-14
  • 1970-01-01
  • 2011-03-18
  • 2012-05-15
  • 2012-01-21
  • 2012-11-30
相关资源
最近更新 更多