C++ CRTP基到派生转换

C++ CRTP基到派生转换,c++,inheritance,crtp,C++,Inheritance,Crtp,假设我有以下使用经典继承的简单类层次结构: struct A_classic {}; struct B_classic : A_classic {}; template<class Derived> struct A_crtp_base {}; struct A_crtp : A_crtp_base<A_crtp> {}; template<class Derived> struct B_crtp_base : A_crtp_base<B_crtp_b

假设我有以下使用经典继承的简单类层次结构:

struct A_classic {};
struct B_classic : A_classic {};
template<class Derived> struct A_crtp_base {};
struct A_crtp : A_crtp_base<A_crtp> {};
template<class Derived> struct B_crtp_base : A_crtp_base<B_crtp_base<Derived>> {};
struct B_crtp : B_crtp_base<B_crtp> {};
我想实现一个从a_classic到B_classic的转换操作符。为了尽可能多地重用代码,我做到了

A_classic a; // Given as input argument
B_classic b;
static_cast<A_classic&>(b) = a; // Copy A_classic's members
// Now set up B_classic's members
一个明显的解决方案是模板化一个\u crtp\u库的复制构造函数:

但是,我必须编写自己的复制构造函数,这是我想要避免的


有什么建议可以减少这里的编码量吗?

您可以定义自己的转换运算符到公共A_crtp_基类

一个小建议:如果可能的话,尽量简化层次结构,如果需要一个简单的继承机制,那么您将强制编译器处理不同类型的对象,并且呈现出比它们可能更复杂的东西

A_crtp a;
B_crtp b;
static_cast<A_crtp_base<???>&>(b) = a; 
// No matter what I put here, either the cast or the assignment will fail
template<class Derived>
struct A_crt_base {
   template<class OtherDerived>
   A_crtp_base(const A_crtp_base<OtherDerived>& other);
}
struct B_crtp;
template<class Derived> struct B_crtp_base;

template<class Derived>
struct A_crtp_base {

    operator B_crtp_base<B_crtp>();
};

struct A_crtp : A_crtp_base<A_crtp> {
    };

template<class Derived> struct B_crtp_base : A_crtp_base<B_crtp_base<Derived>> {};

struct B_crtp : B_crtp_base<B_crtp> {};

template<class Derived>
A_crtp_base<Derived>::operator B_crtp_base<B_crtp>()
{
        return B_crtp_base<B_crtp>(); // Whatever, make sure this is set with common A_crtp_base stuff
}

int main() 
{
   A_crtp a;
   B_crtp b;

   static_cast< B_crtp_base<B_crtp>& >(b) = a;

   return 0;
}