我正在尝试专门针对模板类(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/

10-09 12:44