【发布时间】:2012-08-14 17:01:09
【问题描述】:
我目前正在使用基类template<class CRTP> Base 和派生类Derived1 : public Base<Derived1>、Derived2 : public Base<Derived2>...实现一些CRTP...
数学运算符在Base 中定义,属于CRTP Base<CRTP>::operator+(const CRTP& rhs) 类型,这意味着我们可以将Derived1 添加到Derived1,但不能将Derived2 添加到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类型
这样的事情存在吗?您有其他解决方案吗?
非常感谢!
【问题讨论】:
标签: inheritance c++11 operator-overloading crtp enable-if