我有一个包装类,需要与包装类互换使用。
幸运的是,类和包装器是二进制兼容的(按设计),并且转换可以很容易地执行(例如在这种情况下由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值重载。