1

我有一个需要与包装类互换使用的包装类。幸运的是,类和包装器是二进制兼容的(通过设计),并且可以轻松执行转换(例如在本例中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) 涉及左值重载。

4

0 回答 0