有特定模板类的朋友:“模板<任何...>朋友类A;”

时间:2017-05-21 04:00:14

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

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

实施例

我总是这样宣布朋友: -

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

这是不可能的吗?

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

1 个答案:

答案 0 :(得分:2)

以这种方式:

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