template
struct has_member_foo11
{
private:
template static auto check(int) -> decltype(std::declval().foo(), std::true_type());
template static std::false_type check(...);
public:
enum { value = std::is_same(0)), std::true_type>::value };
};
//more universal
template
struct has_member_foo11
{
private:
template static auto check(int) -> decltype(std::declval().foo(std::declval()...), std::true_type());
template static std::false_type check(...);
public:
enum { value = std::is_same(0)), std::true_type>::value };
};
//Improve
#define HAS_MEMBER(member)\
templatestruct has_member_##member\
{\
private:\
template static auto Check(int) -> decltype(std::declval().member(std::declval()...), std::true_type());\
template static std::false_type Check(...);\
public:\
enum{value = std::is_same(0)), std::true_type>::value};\
};
//test code
HAS_MEMBER(foo)
HAS_MEMBER(func)
struct MyStruct
{
string foo() { return ""; }
int func(int i) { return i; }
};
static_assert(has_member_foo::value, "true");
static_assert(has_member_funcint>::value, "true");