В настоящее время я реализую некоторый CRTP с базовым классом template<class CRTP> Base
и производными классами Derived1 : public Base<Derived1>
, Derived2 : public Base<Derived2>
...
Математические операторы определены в 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
: если правая сторона имеет типBase
false
: если rhs имеет типDerived
Существует ли такая вещь? У вас есть другое решение?
Большое спасибо !