Tôi đang sử dụng chức năng SFINAE rất nhiều trong một dự án và không chắc có sự khác biệt nào giữa hai cách tiếp cận sau (ngoài phong cách) không:
#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;
}
Đầu ra của chương trình như mong đợi:
method 1
method 2
Done...
Tôi đã thấy phương thức 2 được sử dụng thường xuyên hơn trong stackoverflow, nhưng tôi thích phương thức 1 hơn.
Có trường hợp nào khi hai cách tiếp cận này khác nhau không?