我目前正在使用基类template<class CRTP> Base和派生类实现一些 CRTP Derived1 : public Base<Derived1>,Derived2 : public Base<Derived2>...
数学运算符在中定义,Base并且属于CRTP Base<CRTP>::operator+(const CRTP& rhs)那种意味着我们可以将 a 添加Derived1到 aDerived1但不能将 a 添加到Derived2a 的类型Derived1。
此外,我已经定义了运算符Base<CRTP>& Base<CRTP>::operator()(),这意味着Derived1()将返回Base<Derived1>&。
我想知道是否有解决方案来执行以下操作:
Derived1 = Derived1 + Derived1 : OK
Derived2 = Derived2 + Derived2 : OK
Derived1 = Derived1 + Derived2 : NOT OK
Derived1 = Derived1() + Derived2() : OK
根据最后两行:
- 我防止用户犯错误
- 但是如果他真的想做这个操作,他可以将派生类型“强制转换”为基类型,这样就可以了
我唯一需要做的就是定义一个这样的运算符:
template<class CRTP0, class = typename std::enable_if</* SOMETHING */>::type>
Base<CRTP> Base<CRTP>::operator+(const Base<CRTP0>& rhs)
在 enable_if 我想要的是:
true: 如果 rhs 是Base类型false: 如果 rhs 是一个Derived类型
存在这样的事情吗?您有其他解决方案吗?
非常感谢你 !