我目前正在使用基类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 添加到Derived2
a 的类型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
类型
存在这样的事情吗?您有其他解决方案吗?
非常感谢你 !