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并没有真正添加任何有价值的东西.