【发布时间】:2018-12-30 22:03:04
【问题描述】:
我有一个程序如下。有一个基本模板 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。
为什么选择第二个特化而不是第一个,因为它们都有效地声明了
struct X<int, void>。是什么让std::enable_if_t<std::is_integral_v<T>>比基本模板中显示的默认模板类型参数更专业?为什么基本模板的默认类型参数必须与要调用的部分特化和要打印的
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。
标签: c++ templates c++14 sfinae partial-specialization