std::enable_if
ฉันพยายามที่จะได้รับตัวอย่างง่ายๆในการทำงานจะเข้าใจวิธีการใช้งาน หลังจากที่ฉันอ่านคำตอบนี้ฉันคิดว่ามันไม่ควรยากเกินไปที่จะเกิดขึ้นกับตัวอย่างง่ายๆ ฉันต้องการใช้std::enable_if
เพื่อเลือกระหว่างสองฟังก์ชั่นสมาชิกและอนุญาตให้ใช้หนึ่งในนั้นเท่านั้น
น่าเสียดายที่สิ่งต่อไปนี้ไม่ได้รวบรวมกับ gcc 4.7 และหลังจากเวลาผ่านไปหลายชั่วโมงของการลองฉันถามพวกคุณว่าสิ่งที่ฉันผิดคืออะไร
#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 รายงานปัญหาต่อไปนี้:
% 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()'
ทำไม g ++ ไม่ลบอินสแตนซ์ที่ไม่ถูกต้องสำหรับฟังก์ชันสมาชิกที่สอง? ตามมาตรฐานstd::enable_if< bool, T = void >::type
มีอยู่เฉพาะเมื่อพารามิเตอร์เทมเพลตบูลีนเป็นจริง แต่ทำไม g ++ ไม่ถือว่านี่เป็น SFINAE ฉันคิดว่าข้อความแสดงข้อผิดพลาดมากเกินไปมาจากปัญหาที่ g ++ ไม่ได้ลบฟังก์ชั่นสมาชิกที่สองและเชื่อว่าสิ่งนี้จะเป็นการโอเวอร์โหลด
std::is_same< T, int >::value
และ! std::is_same< T, int >::value
สิ่งที่ให้ผลลัพธ์เดียวกัน