Tôi đã sử dụng thành ngữ SFINAE một vài lần và tôi đã sử dụng để đặt các thông số mẫu của mình thay vì trả về. Tuy nhiên, tôi đã xem xét một số trường hợp tầm thường mà nó không hoạt động, và tôi không chắc tại sao. Trước hết, đây là của tôi chính:SFINAE hoạt động theo kiểu trả về chứ không phải là thông số mẫu
int main()
{
foo(5);
foo(3.4);
}
Đây là một thực hiện foo
đã kích hoạt lỗi:
template<typename T,
typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T)
-> void
{
std::cout << "I'm an integer!\n";
}
template<typename T,
typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T)
-> void
{
std::cout << "I'm a floating point number!\n";
}
Và đây là một mảnh được cho là tương đương với mã mà hoạt động tốt:
template<typename T>
auto foo(T)
-> typename std::enable_if<std::is_integral<T>::value>::type
{
std::cout << "I'm an integrer!\n";
}
template<typename T>
auto foo(T)
-> typename std::enable_if<std::is_floating_point<T>::value>::type
{
std::cout << "I'm a floating point number!\n";
}
Câu hỏi của tôi là: tại sao việc triển khai đầu tiên của foo
gây ra lỗi trong khi lỗi thứ hai không kích hoạt?
main.cpp:14:6: error: redefinition of 'template<class T, class> void foo(T)' auto foo(T) ^ main.cpp:6:6: note: 'template<class T, class> void foo(T)' previously declared here auto foo(T) ^ main.cpp: In function 'int main()': main.cpp:23:12: error: no matching function for call to 'foo(double)' foo(3.4); ^ main.cpp:6:6: note: candidate: template<class T, class> void foo(T) auto foo(T) ^ main.cpp:6:6: note: template argument deduction/substitution failed: main.cpp:5:10: error: no type named 'type' in 'struct std::enable_if<false, void>' typename = typename std::enable_if<std::is_integral<T>::value>::type> ^
EDIT:
Ok. Trình diễn thực tế: [1 không biên dịch được] (http://ideone.com/mJ8Zp6) và [phần biên dịch thành công thứ 2] (http://ideone.com/G0jBft). –
Thông tin bổ sung: cùng với VS 2012 tháng 11 CTP. –
[Điều này] (http://flamingdangerzone.com/cxx11/2012/06/01/almost-static-if.html) nên được đọc hoàn hảo cho bạn. – Xeo