【发布时间】:2020-01-30 20:06:35
【问题描述】:
我正在尝试使用std::enable_if_t 根据传递给它的类型的特征来切换模板函数的实现。
这是一个例子:
#include <iostream>
#include <type_traits>
// Enable if "T" is integral
template <typename T,
typename = std::enable_if_t<std::is_integral_v<T>>
>
void print(T value)
{
std::cout << "Integral: " << value << std::endl;
}
// Enable if "T" is not integral
template <typename T,
typename = std::enable_if_t<!std::is_integral_v<T>>
>
void print(T value)
{
std::cout << "Not Integral: " << value << std::endl;
}
int main()
{
int i = 42;
print(i);
double d = 42.0;
print(d);
}
问题是,这无法编译说明:
'void print(T)':函数模板已经定义。
这让我感觉很奇怪,因为 std::is_integral_v<T> 和 !std::is_integral_v<T> 永远不会同时评估为 true,所以每当启用一个实现时,另一个实现应该被禁用。
为什么这不起作用?解决此问题并获得我正在寻找的功能的最佳方法是什么?
【问题讨论】:
标签: c++ templates c++17 template-meta-programming enable-if