我有一个需要与包装类互换使用的包装类。幸运的是,类和包装器是二进制兼容的(通过设计),并且可以轻松执行转换(例如在本例中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>
.
这与如何删除相似的 const 和非 const 成员函数之间的代码重复非常相似?,但是这种情况更具体,因为 1) 它涉及转换运算符,并且,2) 涉及左值重载。