我在项目中大量使用函数SFINAE,并且不确定以下两种方法(除了样式)是否存在任何差异:
#include <cstdlib>
#include <type_traits>
#include <iostream>
template <class T, class = std::enable_if_t<std::is_same_v<T, int>>>
void foo()
{
std::cout << "method 1" << std::endl;
}
template <class T, std::enable_if_t<std::is_same_v<T, double>>* = 0>
void foo()
{
std::cout << "method 2" << std::endl;
}
int main()
{
foo<int>();
foo<double>();
std::cout << "Done...";
std::getchar();
return EXIT_SUCCESS;
}
程序输出符合预期:
method 1
method 2
Done...
我已经看到方法2在stackoverflow中使用得更频繁,但是我更喜欢方法1。
这两种方法有什么不同的情况吗?
您如何运行该程序?它不会为我编译。
—
改变igel
@alter igel,它将需要C ++ 17编译器。我使用MSVC 2019来测试此示例,但我主要使用Clang。
—
基思
相关:为什么我应该避免在函数签名中出现易碎的迹象,并且C ++ 20还引入了新的概念:-)
—
Jarod42 '19
@ Jarod42从C ++ 20开始,概念对我来说是最需要的东西之一。
—
瓦尔说莫妮卡(Monica)恢复