gpt4 book ai didi

c++ - 如何与特定模板特化成为 friend ?

转载 作者:可可西里 更新时间:2023-11-01 18:28:19 25 4
gpt4 key购买 nike

是否有一种语法可以只对模板类的某些特化进行友化,或者你是否必须将所有的特化与诸如:

template<class FooType> friend class Bar;

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

template<class FooType> friend class Bar<FooType const>;

特化似乎有自己的“友好”身份,因为默认情况下它们不是彼此的 friend 。例如,getFoo()这里不能被从 const 特化派生的非常量情况调用,因为它是私有(private)的:

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

您必须添加 template<class FooType> friend Bar;到 const 特化。

(顺便说一句, 的标签描述有点滑稽。)

最佳答案

你在找

friend Bar<FooType const>;

这是两种方式之一,friend可以声明。第一个语法将类声明为友元:

friend Type;

哪里Type可以是简单类型 Bar (这不是模板),也可以是类模板的特定实例,例如 Baz<int> . int当然,也可以是封闭类模板中的模板参数或您喜欢的任何内容。重点是:它是一个被赋予 friend 状态的单一类型。

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

template< ... > friend class ClassTemplate;

哪里...ClassTemplate的模板参数声明.如您所见,您只需指定模板参数列表,但该列表并未在任何地方使用。不可能将这两种语法结合起来,没有办法“部分友化”类模板或使用 SFINAE/enable_if启用或禁用某些好友声明。事实上,将名称添加到模板参数甚至没有多大意义,在你的上面我只是写

template< class > friend class Bar;

添加FooType在这里并没有真正增加任何有值(value)的东西。

关于c++ - 如何与特定模板特化成为 friend ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19546949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com