2017-04-19 71 views
0

我想知道模板類型是否有'push_back'方法。 我試過了這個例子:Is it possible to write a template to check for a function's existence?在VS2015上用SFINAE在模板上檢查方法存在

我的代碼:

template <typename T> 
class has_push_back 
{ 
    typedef char one; 
    typedef long two; 

    template <typename C> static one test(char[sizeof(&C::push_back)]); 
    template <typename C> static two test(...); 

public: 
    enum { value = (sizeof(test<T>(0)) == sizeof(char)) }; 
}; 

我的電話:

template <typename T> 
    HTTPMessage Serializer::GetHTTPMessage(T varToSerialize) 
    { 
     std::cout << has_push_back<T>::value << std::endl; 
     //some code 
    } 

不幸的是,我得到這個錯誤時GetHTTPMessage被調用的std :: string:

'重載函數':非法sizeof操作數

注:見參考文獻類模板實例 'has_push_back' 正在編譯 與 [ T =的std :: string ]

我不明白爲什麼它不編譯。

回答

-1

SFINAE is not yet properly supported in VS2015

雖然這似乎是可能的(請注意,我只檢查特定超載存在):

#include <type_traits> 

template< typename T, typename = void > struct 
has_push_back 
{ 
    static bool const value = false; 
}; 

template< typename T > struct 
has_push_back 
< 
    T 
, typename ::std::enable_if_t 
    < 
     ::std::is_same 
     < 
      void 
     , decltype(::std::declval<T>().push_back(::std::declval< typename T::value_type >())) 
     >::value 
    > 
> 
{ 
    static bool const value = true; 
}; 

::std::cout << has_push_back<int>::value << ::std::endl; // 0 
::std::cout << has_push_back< ::std::vector<int> >::value << ::std::endl; // 1 
+0

你說得對的事實,VS2015不能正確支持SFINAE ,但我已經用不同的方法解決了我的問題。謝謝。 – Morgan

+0

也許你在這裏發佈它作爲另一個答案呢? – VTT

+0

不,它確實解決了我的問題,但沒有回答我的問題 – Morgan