我希望启用模板以通过CRTP包含功能,并且还使用相同的模板而不使用此功能,例如对于不包含CRTP模板所需功能的类。
使用std::conditional
的以下代码有效:
#include <type_traits>
class NOCRTP{/*empty dummy class*/};
template <class T> class CRTP{/*addditional functionality here*/};
template<typename T, bool CRTP_ENABLED = true>
class Ok: public std::conditional<CRTP_ENABLED, CRTP<Ok<T> >, NOCRTP >::type{
};
没有std :: conditional通过附加模板参数的方式不会因为TYPE依赖于它自己。
template< typename T, typename TYPE> class Fail;
template< typename T, typename TYPE = CRTP< Fail<T,TYPE > > >
class Fail: public TYPE{
};
这可以通过某种前向声明来解决,还是std :: conditional解决方案唯一的方法?