转换运算符重载l值,避免重复代码

时间:2017-10-02 03:44:55

标签: c++11 const lvalue conversion-operator

我有一个包装类,需要与包装类互换使用。 幸运的是,类和包装器是二进制兼容的(按设计),并且转换可以很容易地执行(例如在这种情况下由reinterpret_cast执行,或者甚至更简单,如示例中所示)。

在某种程度上,要实现这一点,我需要能够通过operator T()从包装类型转换为包装类型。

目前代码如下:

template<class T> // // I am putting this general T type, to show it can be a large (movable) object, for example, std::vector.
struct wrapper{
   T a;
   operator T const&() const&{return a;}  // in other cases it can involve more code, like reinterpret_casts or some conditional blocks.
   operator T&&() &&{return std::move(a);} // same
   operator T&() &{return a;} // same
};

我可以将这三个转换函数压缩成一个函数或更少的代码,还是有其他方法?

我可以通过这种方式使其更加通用(但这个简单案例的代码更长),

template<class T>
struct wrapper{
   T a;
   operator T const&() const&{return a;} // complicated code can be here only
   operator T&&() &&{return std::move(operator A&());}
   operator T&() &{return const_cast<T&>(operator T const&());}
};

最终目标是T可以与wrapper<T>互换使用。

这与How do I remove code duplication between similar const and non-const member functions?非常相似, 但是这种情况更具体,因为1)它涉及转换运算符,2)涉及l值重载。

0 个答案:

没有答案