我有一个程序,如下所示。有一个基本模板
运行程序后会输出
1.为什么第二个特化被选择而不是第一个,因为它们都有效地声明了一个
2.为什么基本模板的默认类型参数必须与部分特化定义的类型相同才能调用部分特化并输出
struct X
和使用SFINAE的部分特化。template <typename T, typename U = void>
struct X{
X() {
std::cout << "in 1" << std::endl;
};
};
template <typename T>
struct X< T, std::enable_if_t<std::is_integral_v<T>> > {
X() {
std::cout << "in 2" << std::endl;
};
};
int main() {
X<int> x;
}
运行程序后会输出
in 2
。1.为什么第二个特化被选择而不是第一个,因为它们都有效地声明了一个
struct X<int, void>
。是什么使得std::enable_if_t<std::is_integral_v<T>>
比基本模板中显示的默认模板类型参数更加专业化?2.为什么基本模板的默认类型参数必须与部分特化定义的类型相同才能调用部分特化并输出
in 2
?为什么将其更改为std::enable_if_t<std::is_integral_v<T>, bool>
会导致调用基本模板in 1
?
std::enable_if_t
来问这个问题。只需在第一个示例中定义偏特化为template <typename T> struct X<T, void>
,在第二个示例中使用bool
而不是void
即可。 - Daniel Langr