在VS2015上使用SFINAE检查模板上是否存在方法

时间:2017-04-19 10:32:22

标签: c++ templates sfinae

我想知道模板类型是否有'push_back'方法。 我试过这个例子:Is it possible to write a template to check for a function's existence?

我的代码:

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
    }

不幸的是,当使用std :: string调用GetHTTPMessage时出现此错误:

  

'overloaded-function':非法sizeof操作数

     

注意:请参阅类模板实例化'has_push_back'的引用   被编译            同            [               T =的std :: string            ]

我不明白为什么它不能编译。

1 个答案:

答案 0 :(得分:-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