c++ - 允许非 const 在包装器模板中转换为 const

标签 c++ templates

如何允许非 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/

相关文章:

c++ - 如何在 C++ 中制作基于 SFINAE 的 Y 组合器?

C++ - << 运算符重载,链表 - 地址而不是标准输出

c++ - 可以 boost ssl 半关闭套接字吗?

c++ - 强制未使用的函数在共享库中导出

c++ - 关于 C++ 中一个或多个多重定义方法的错误

c++ - 需要引用标准关于 main 函数作为模板函数的合法性

c++ - 具有可变参数模板的功能组合

c++ - 在结束运行之前在 C++ 中获取 shell 命令输出

c++ - 在模板类中使用标准容器迭代器

c++ - 模板的多态使用