类模板SFINAE通过继承

时间:2017-11-13 20:29:05

标签: c++ templates inheritance sfinae

以下s1类模板专门化仅允许在使用整数类型模板参数时实例化s1

template <typename, typename = void>
  struct s1;

template <typename T>
struct s1<T, std::enable_if_t<std::is_integral<T>::value>> { };

以下类模板s2类似;虽然它有条件地从一个普通的基类私下继承。 s1s2之间的功能有何不同?

struct Base { };

template <typename T>
struct s2 : private std::enable_if_t<std::is_integral<T>::value,Base> { };

1 个答案:

答案 0 :(得分:2)

使用s1,您可以使用新的专业化扩展它,涵盖分布式代码位中的更多案例。 SFINAE会启动,只要只有一个专业化是有效的,它就会被选中。

在这种专业化中测试的表达是任意的。

我可以创建一个s1专门化,当T是浮点数,复杂类型或数组时接受它。

对于s2,只有模板模式匹配可以优先选择裸T的东西才能用于创建进一步的匹配特化。例如,无法创建接受任何浮点类型的s2专门化,但我可以创建一个接受任何指针的专门化。