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 !!!!!!

 

arrow
arrow
    全站熱搜

    hedgezzz 發表在 痞客邦 留言(0) 人氣()