Class 通过继承模板 SFINAE

Class Template SFINAE via Inheritance

下面的 s1 class 模板特化只允许在使用整数类型模板参数时实例化 s1

template <typename, typename = void>
  struct s1;

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

下面的class模板,s2是相似的;尽管它有条件地从一个普通的基础 class 私有继承。 s1s2 在功能上有什么区别?

struct Base { };

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

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

在此类专业中测试的表达式是任意的。

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

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