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 私有继承。 s1
和 s2
在功能上有什么区别?
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
专业化,但我可以创建接受任何指针的专业化。
下面的 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 私有继承。 s1
和 s2
在功能上有什么区别?
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
专业化,但我可以创建接受任何指针的专业化。