以下s1
类模板专门化仅允许在使用整数类型模板参数时实例化s1
。
template <typename, typename = void>
struct s1;
template <typename T>
struct s1<T, std::enable_if_t<std::is_integral<T>::value>> { };
以下类模板s2
类似;虽然它有条件地从一个普通的基类私下继承。 s1
和s2
之间的功能有何不同?
struct Base { };
template <typename T>
struct s2 : private std::enable_if_t<std::is_integral<T>::value,Base> { };
答案 0 :(得分:2)
使用s1
,您可以使用新的专业化扩展它,涵盖分布式代码位中的更多案例。 SFINAE会启动,只要只有一个专业化是有效的,它就会被选中。
在这种专业化中测试的表达是任意的。
我可以创建一个s1
专门化,当T
是浮点数,复杂类型或数组时接受它。
对于s2
,只有模板模式匹配可以优先选择裸T
的东西才能用于创建进一步的匹配特化。例如,无法创建接受任何浮点类型的s2
专门化,但我可以创建一个接受任何指针的专门化。