【发布时间】:2020-04-15 19:30:18
【问题描述】:
我在一个项目中大量使用函数 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。
这两种方法有什么不同吗?
【问题讨论】:
-
你如何运行这个程序? It won't compile for me.
-
@alter igel 它需要一个 C++17 编译器。我使用 MSVC 2019 来测试这个示例,但我主要使用 Clang。
-
相关:why-should-i-avoid-stdenable-if-in-function-signatures 和 C++20 还引入了新的概念方法 :-)
-
@Jarod42 概念是我在 C++20 中最需要的东西之一。