#include <type_traits>
template <typename T>
std::true_type call_foo (int (T::*)(float));
template <typename C>
decltype(call_foo(&C::foo)) has_foo (int);
template <typename C>
std::false_type has_foo (...);
template<typename T>
using HasFoo = decltype(has_foo<T>(0));
struct A {
int foo(float);
};
struct B : public A {
};
struct C {
unsigned int foo(double);
};
struct D {
static int foo(float);
};
static_assert(HasFoo<A>::value, "A should have foo.");
static_assert(HasFoo<B>::value, "B should inherit foo from A.");
static_assert(!HasFoo<C>::value, "C should not have foo.");
static_assert(!HasFoo<D>::value, "Ds static foo should be false.");
struct E {};
static_assert(!HasFoo<E>::value, "E does not have foo.");
int main () {
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0ZDo6dHJ1ZV90eXBlIGNhbGxfZm9vIChpbnQgKFQ6OiopKGZsb2F0KSk7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQz4KZGVjbHR5cGUoY2FsbF9mb28oJkM6OmZvbykpIGhhc19mb28gKGludCk7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQz4Kc3RkOjpmYWxzZV90eXBlIGhhc19mb28gKC4uLik7CgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdXNpbmcgSGFzRm9vID0gZGVjbHR5cGUoaGFzX2ZvbzxUPigwKSk7CgpzdHJ1Y3QgQSB7CiAgaW50IGZvbyhmbG9hdCk7Cn07CgpzdHJ1Y3QgQiA6IHB1YmxpYyBBIHsKfTsKCnN0cnVjdCBDIHsKICB1bnNpZ25lZCBpbnQgZm9vKGRvdWJsZSk7Cn07CgpzdHJ1Y3QgRCB7CiAgc3RhdGljIGludCBmb28oZmxvYXQpOwp9OwoKc3RhdGljX2Fzc2VydChIYXNGb288QT46OnZhbHVlLCAiQSBzaG91bGQgaGF2ZSBmb28uIik7CnN0YXRpY19hc3NlcnQoSGFzRm9vPEI+Ojp2YWx1ZSwgIkIgc2hvdWxkIGluaGVyaXQgZm9vIGZyb20gQS4iKTsKCnN0YXRpY19hc3NlcnQoIUhhc0ZvbzxDPjo6dmFsdWUsICJDIHNob3VsZCBub3QgaGF2ZSBmb28uIik7CnN0YXRpY19hc3NlcnQoIUhhc0ZvbzxEPjo6dmFsdWUsICJEcyBzdGF0aWMgZm9vIHNob3VsZCBiZSBmYWxzZS4iKTsKCnN0cnVjdCBFIHt9OwpzdGF0aWNfYXNzZXJ0KCFIYXNGb288RT46OnZhbHVlLCAiRSBkb2VzIG5vdCBoYXZlIGZvby4iKTsKCmludCBtYWluICgpIHsKCQp9Cg==