check member function


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");
C++