http://oopscenities.net/2012/04/30/c-sfinae/
template <typename T>
struct has_iterator
{
template <typename U>
static char test(typename U::iterator* x);
template <typename U>
static long test(U* x);
static const bool value = sizeof(test<T>(0)) == 1;
};
int main()
{
cout << has_iterator<int>::value << endl;
cout << has_iterator<vector<int> >::value << endl;
}
output :
0
1
這個程式只能在 c++11 使用 , c++0x compiler 會錯掉 !!! SFINAE means
Substitution Failure Is Not An Error
當你使用 T = int , compiler 找第一個 test , 發現 int 沒有 iterator member function , 這時 compiler
再找下一個 test() , 這時 可以 , 所以 sizeof(test<T>(0)) 就是 long ==> 8 bytes , 不等於 1 ,
所以 has_iterator<int>::value 是 0 , 而當 T = vector<int> 第一個 test()就 ok 了 ,
因為 vector<int> 有 iterator member function , 所以 return char ==> 1 byte , 所以
has_iterator<vector<int> >::value 是 1 !!!!!
sizeof(test<T>(0)) 這邊的 0 是 nullptr 的意思 , test() 的參數 是指標,所以給它一個 nullptr 當參數
程式才能正確 compiler !!!!!!
留言列表