【问题标题】:Declare a variadic template class a friend of a simple template class将可变参数模板类声明为简单模板类的朋友
【发布时间】:2016-12-01 17:50:36
【问题描述】:

我有一个带有可变参数模板参数包的头等舱,如下所示:

template <typename T, typename... Args>
class A
{
    public: ...etc

我有一个带有简单模板参数的第二个类:

template <typename T>
class B
{
       public: ...etc

两个模板的第一个类型参数将相同。

我想将 A 类声明为 B 的朋友,以便 A 可以访问 B 的几个私有方法。如何实现呢?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    如果你可以接受无条件的友谊(即每个A都是B的朋友,即使T参数不匹配),那么你可以简单地使用@ 987654325@:

    template <typename T>
    class B;
    
    template <typename T, typename... Args>
    class A
    {
    public:
        void test(B<T>& b);
    };
    
    template <typename T>
    class B
    {
        template <typename, typename...>
        friend class A;
    
        int priv;
    };
    
    template <typename T, typename... Args>
    void A<T, Args...>::test(B<T>& b){ (void) b.priv; } 
    

    以下代码将编译:

    int main()
    {
        B<int> b;
        A<int, float> a;
        a.test(b);
    }
    

    wandbox example

    【讨论】:

    • 谢谢。相同的 T 参数将在其他地方强制执行,所以无条件的没什么大不了的。
    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 2017-02-09
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多