我想知道模板类型是否有'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 ]
我不明白为什么它不能编译。
答案 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