繁体   English   中英

从CRTP到衍生转化

[英]CRTP Base to Derived Conversion

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

struct A_classic {};
struct B_classic : A_classic {};

我想实现一个从A_classicB_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

问题是实际上我在使用CRTP进行继承:

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_crtpB_crtp的“公共”基类B_crtpA_crtp_base<A_crtp>A_crtp_base<B_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

一个明显的解决方案是对A_crtp_base的副本构造函数进行模板A_crtp_base

template<class Derived>
struct A_crt_base {
   template<class OtherDerived>
   A_crtp_base(const A_crtp_base<OtherDerived>& other);
}

但是然后我必须编写自己的副本构造函数,这是我想避免的。

有什么建议可以减少此处的编码量吗?

您可以将自己的转换运算符定义为通用A_crtp_base

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;
}

一个小建议:如果可能,尝试稍微简化层次结构,如果需要简单的继承机制,则将迫使编译器处理不同类型的对象,并使事情变得比它们复杂得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM