Std:Enable_if可以有條件地編譯成員函數我試著用一個簡單的例子來理解如何使用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+不刪除第二個成員函數的問題,并認為這應該是過載
3 回答

嗶嗶one
TA貢獻1854條經驗 獲得超8個贊
我也是這么想的,我試著用 std::is_same< T, int >::value
和 ! std::is_same< T, int >::value
結果是一樣的。
Y<int>
T
!std::is_same< T, int >::value
Y<int>
class Y<int> { public: /* instantiated from template < typename = typename std::enable_if< std::is_same< T, int >::value >::type > T foo() { return 10; } */ template < typename = typename std::enable_if< true >::type > int foo(); /* instantiated from template < typename = typename std::enable_if< ! std::is_same< T, int >::value >::type > T foo() { return 10; } */ template < typename = typename std::enable_if< false >::type > int foo();};
std::enable_if<false>::type
enable_if

DIEA
TA貢獻1820條經驗 獲得超3個贊
#include <iostream>#include <type_traits>class foo;class bar;template<class T>struct is_bar{ template<class Q = T> typename std::enable_if<std::is_same<Q, bar>::value, bool>::type check() { return true; } template<class Q = T> typename std::enable_if<!std::is_same<Q, bar>::value, bool>::type check() { return false; }};int main(){ is_bar<foo> foo_is_bar; is_bar<bar> bar_is_bar; if (!foo_is_bar.check() && bar_is_bar.check()) std::cout << "It works!" << std::endl; return 0;}

慕仙森
TA貢獻1827條經驗 獲得超8個贊
#include <utility>#include <iostream>template< typename T >class Y { template< bool cond, typename U > using resolvedType = typename std::enable_if< cond, U >::type; public: template< typename U = T > resolvedType< true, U > foo() { return 11; } template< typename U = T > resolvedType< false, U > foo() { return 12; }};int main() { Y< double > y; std::cout << y.foo() << std::endl;}
g++ -std=gnu++14 test.cpp
./a.out 11
- 3 回答
- 0 關注
- 1918 瀏覽
添加回答
舉報
0/150
提交
取消