如何将特定模板专业化的朋友?

Hos*_*ork 9 c++ templates friend c++11

是否存在仅为某个模板类的某些特化提供友情的语法,或者您是否必须将所有特殊化的朋友与以下内容相关联:

template<class FooType> friend class Bar;
Run Code Online (Sandbox Code Playgroud)

如果它存在,我会寻找类似的东西:

template<class FooType> friend class Bar<FooType const>;
Run Code Online (Sandbox Code Playgroud)

专业化似乎有自己的"友好"身份,因为默认情况下他们不是彼此的朋友.例如,getFoo()这里不能通过const专门化派生的非const情况调用,因为它是私有的:

template<class FooType> class Bar;

template<class FooType>
class Bar<FooType const> {
public:
    Bar (std::string name) : _foo (name) { }
    FooType const * operator->() const
        { return &getFoo(); }
private:
    FooType const & getFoo() const
        { return _foo; }
private:
    FooType _foo;
};

template<class FooType>
class Bar : public Bar<FooType const> {
public:
    Bar (std::string name) : Bar<FooType const> (name) { }
    FooType * operator->()
        { return &getFoo(); }
private:
    FooType & getFoo()
        { return const_cast<FooType &>(Bar<FooType const>::getFoo()); }
};
Run Code Online (Sandbox Code Playgroud)

你必须添加template<class FooType> friend Bar;到const专业化.

(顺便说一句,的标签描述很有趣.)

Dan*_*rey 10

你在找

friend Bar<FooType const>;
Run Code Online (Sandbox Code Playgroud)

这是声明s 的两种方式之一friend.第一种语法将一个类声明为朋友:

friend Type;
Run Code Online (Sandbox Code Playgroud)

例如,where Type可以是简单类型Bar(不是模板),也可以是类模板的特定实例Baz<int>.int当然,也可以是封闭类模板或任何你喜欢的模板参数.重点是:它是一种获得朋​​友身份的单一类型.

第二种语法将类模板声明为朋友:

template< ... > friend class ClassTemplate;
Run Code Online (Sandbox Code Playgroud)

其中...是模板参数声明ClassTemplate.如您所见,您必须仅指定模板参数列表,但不会在任何地方使用该列表.无法将两种语法组合在一起,无法"部分地与朋友"类模板或使用SFINAE/enable_if来启用或禁用某些朋友声明.实际上,在模板参数中添加名称甚至没有多大意义,在上面我只是写

template< class > friend class Bar;
Run Code Online (Sandbox Code Playgroud)

因为添加FooType并没有真正添加任何有价值的东西.