Tôi đang cố gắng để có được một ví dụ đơn giản để làm việc để hiểu cách sử dụng std::enable_if
. Sau khi tôi đọc this answer, tôi nghĩ không quá khó để đưa ra một ví dụ đơn giản. Tôi muốn sử dụng std::enable_if
để chọn giữa hai hàm thành viên và chỉ cho phép một trong số chúng được sử dụng.std :: enable_if để có điều kiện biên dịch chức năng thành viên
Thật không may, những điều sau đây không biên dịch với gcc 4.7 và sau giờ làm việc và giờ cố gắng, tôi hỏi các bạn rằng lỗi của tôi là gì.
#include <utility>
#include <iostream>
template< class T >
class Y {
public:
template < typename = typename std::enable_if<true>::type >
T foo() {
return 10;
}
template < typename = typename std::enable_if<false>::type >
T foo() {
return 10;
}
};
int main() {
Y<double> y;
std::cout << y.foo() << std::endl;
}
gcc báo cáo các vấn đề sau:
% LANG=C make CXXFLAGS="-std=c++0x" enable_if
g++ -std=c++0x enable_if.cpp -o enable_if
enable_if.cpp:12:65: error: `type' in `struct std::enable_if<false>' does not name a type
enable_if.cpp:13:15: error: `template<class T> template<class> T Y::foo()' cannot be overloaded
enable_if.cpp:9:15: error: with `template<class T> template<class> T Y::foo()'
Tại sao không g ++ xóa instantiation sai cho chức năng thành viên thứ hai? Theo tiêu chuẩn, std::enable_if< bool, T = void >::type
chỉ tồn tại khi tham số mẫu boolean là đúng. Nhưng tại sao g ++ không coi đây là SFINAE? Tôi nghĩ rằng thông báo lỗi quá tải xuất phát từ vấn đề mà g ++ không xóa chức năng thành viên thứ hai và tin rằng đây phải là một tình trạng quá tải.
Tôi không chắc chắn, nhưng tôi nghĩ rằng đó là những điều sau đây: enable_if dựa trên SFINAE (lỗi thay thế không phải là một lỗi). Tuy nhiên, bạn không có bất kỳ sự thay thế nào ở đây, vì không có tham số nào không thể được sử dụng để xác định mức sử dụng quá tải nào. Bạn nên làm cho "true" und "false" phụ thuộc vào T. (Tôi biết bạn không muốn làm điều đó trong ví dụ đơn giản, nhưng nó có lẽ quá đơn giản bây giờ ...) – Philipp
Tôi nghĩ về điều đó quá và cố gắng sử dụng 'std :: is_same < T, int > :: giá trị' và'! std :: is_same < T, int > :: giá trị' cho kết quả tương tự. – evnu