如何允许非 const 引用在包装器模板复制构造函数中转换为 const 引用?请注意,我的复制构造函数是一个逻辑移动构造函数(C++11 之前的版本)——init
成员跟踪哪个包装器当前有效。
template<typename T>
class wrap
{
T & object;
bool init;
public:
wrap( T& object ) : object(object), init( true ) { }
//attempt which fails since "init" is private in other type
template<typename O>
wrap( wrap<O> const & o )
: object( o.object )
, init( true )
{
const_cast<wrap<O>&>(o).init = false;
}
};
如果其他类型完全相同,则此方法工作正常,因为访问规则允许访问私有(private) init
变量。基本上,以下应该有效:
//adding const
wrap<Type> a( get() );
wrap<Type const> b = a;
//base type would also be nice
wrap<BaseType> c = a;
最佳答案
结交其他专业:
template <typename U> friend class wrap;
或者为了更好的封装,只是他们的转换构造函数:
template <typename U> template <typename O>
friend wrap<U>::wrap(wrap<O> const &);
最好声明init
mutable
;使用 const_cast
,如果有人试图复制 const
对象,则存在未定义行为的风险。
另外,请注意您的构造函数模板不会重载隐式生成的复制构造函数。您还需要一个复制构造函数来使用 init
做正确的事情:
wrap(wrap const & o) : object(o.object), init(true) {o.init = false;}
关于c++ - 允许非 const 在包装器模板中转换为 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9020318/