#include <iostream>
#include <type_traits>
template <typename T, typename ...Args>
struct has_member_foo {
private:
template <typename U>
static auto Check(int) -> decltype(std::declval<U>().foo(std::declval<Args>()...), std::true_type());
template <typename U>
static std::false_type Check(...);
public:
enum { value = std::is_same<decltype(Check<T>(0)), std::true_type>::value };
};
struct Test {
void foo(int a, double b) {
}
void foo(int a) {
}
void foo() {
}
};
int main() {
std::cout << has_member_foo<Test, int, double>::value << std::endl;
std::cout << has_member_foo<Test, int>::value << std::endl;
std::cout << has_member_foo<Test>::value << std::endl;
return 0;
}