我正在尝试专门针对模板类(CRTP)的一些特征(例如cppunit中的std::is_arithmetic或assertion_traits),该特征可以包含模板参数类型的值(类似于BOOST_STRONG_TYPEDEF
)
我尝试使用SFINAE限制我的特化
该示例代码可在gcc6及更高版本上正常运行,但不能在Visual c++(2015或2017)下编译
error C2753: 'is_ar<T>': partial specialization cannot match argument list for primary template
或clang6
error: class template partial specialization does not specialize any template argument; to define the primary template, remove the template argument list
示例代码:
template<class T, typename B>
struct Base
{
using typed_type = T ;
using base_type = B ;
base_type x;
};
template <typename T>
struct MyType
{
using base_type = T;
base_type x;
};
struct CRTPInt : Base<CRTPInt, int> { };
template <typename T>
struct is_ar
{
static const bool value = false;
};
template <>
struct is_ar<int>
{
static const bool value = true;
};
template <class T, typename...>
using typer = T;
template <typename T>
struct is_ar<typer<T, typename T::base_type, typename T::typed_type>> : is_ar<typename T::base_type>
{
static const bool value = true;
};
static_assert(is_arithmetic<CRTPInt>::value, "failed");
static_assert(is_arithmetic<CRTPInt::base_type>::value, "failed");
我做错什么了 ?
它是有效的c++ 11吗?
如何使其与Visual C++编译器一起使用?
假设我可以修改特征的初始定义,那么来自max66的答案就可以正常工作。但实际上,我想专门针对宏创建的类的框架特征(例如cppunit::assertion_traits)
#define MY_TYPEDEF(type , base) struct type: Base<type , base> { };
该宏声明的类不是模板类,因此我找不到一种专门针对以这种方式生成的所有类的方法。
类型名称base_type和typed_type定义的唯一公分母。
任何的想法 ?
最佳答案
该小节包括std::is_arithmetic
,因此很遗憾,您根本无法进行这种专门化。
关于c++ - SFINAE,专门研究CRTP结构的性状,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47439344/