I have a set of statements that I need to override for an expression template. I would like all derived classes of the base type to match the base type. Other things will then be caught by the generic type. Unfortunately, the generic type captures derived types to the base type. To make things nice and confusing, all the templates are pretty strong, including CRTP. Let me try to give a simpler version of the code:
// Note: 'R' is used for return type template <typename DerivedType, typename R> class Base { // ... }; template <typename E1, typename E2, typename R> class MultOperation : public Base<MultOperation<E1, E2, R>, R> { // ... }; template <typename T> class Terminal : public Base<Terminal<T>, T> { // ... }; // The broken operators: template <typename T1, typename T2, typename R1, typename R2> MultOperation<Base<T1, R1>, Base<T2, R2>, typename boost::common_type<R1, R2>::type> operator*( Base<T1, R1> const& u, Base<T2, R2> const& v) { return MultOperation<Base<T1, R1>, Base<T2, R2>, typename boost::common_type<R1, R2>::type>(u, v); } template <typename T1, typename T2, typename R1, typename R2> MultOperation<Terminal<T1>, Base<T2, R2>, typename boost::common_type<T1, R2>::type> operator*( T1 const& u, Base<T2, R2> const& v) { return MultOperation<Terminal<T1>, Base<T2, R2>, typename boost::common_type<T1, R2>::type>(Terminal<T1>(u), v); } template <typename T1, typename T2, typename R1, typename R2> MultOperation<Base<T1, R1>, Terminal<T2>, typename boost::common_type<R1, T2>::type> operator*( Base<T1, R1> const& u, T2 const& v) { return MultOperation<Base<T1, R1>, Terminal<T2>, typename boost::common_type<R1, T2>::type>(u, Terminal<T2>, v); }
Now I can not use any new C ++ features. (This is part of some refactors for removing old libraries, so we can upgrade to the new cpp standards.) I can use boost. I thought that my answer might lie in boost::enable_if , but all my attempts led to deadlocks. Now keep in mind that the target is expression templates, so I cannot do any input material. Yes, it is so complicated ... I hope you have the magic up your sleeve.
Short version of the question: How can I get (1 * Derived) * Derived to match operator(T, Base) for the first operator, and then operator(Base, Base) for the second operator? Currently, it corresponds to the first penalty, then the second corresponds to one of the basic operators instead, since T does not accept the conversion and is thus better than Base.