#include <iostream>
struct A {};
struct B {
static int bar() { std::cout << "B::bar()" << std::endl; return 0; }
};
struct C {
void bar(int) { std::cout << "C::bar(int)" << std::endl; }
};
template <typename T>
class X {
public:
static void foo() {
foo_impl(static_cast<T*>(nullptr));
}
private:
template <typename U>
static auto foo_impl(U*) -> decltype(U::bar(), void()) {
U::bar();
}
static void foo_impl(...) {}
};
int main() {
X<A>::foo();
X<B>::foo();
X<C>::foo();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEEge307CgpzdHJ1Y3QgQiB7CiAgICBzdGF0aWMgaW50IGJhcigpIHsgc3RkOjpjb3V0IDw8ICJCOjpiYXIoKSIgPDwgc3RkOjplbmRsOyByZXR1cm4gMDsgfQp9OwoKc3RydWN0IEMgewogICAgdm9pZCBiYXIoaW50KSB7IHN0ZDo6Y291dCA8PCAiQzo6YmFyKGludCkiIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIFggewpwdWJsaWM6CiAgICBzdGF0aWMgdm9pZCBmb28oKSB7CiAgICAgICAgZm9vX2ltcGwoc3RhdGljX2Nhc3Q8VCo+KG51bGxwdHIpKTsKICAgIH0KcHJpdmF0ZToKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgogICAgc3RhdGljIGF1dG8gZm9vX2ltcGwoVSopIC0+IGRlY2x0eXBlKFU6OmJhcigpLCB2b2lkKCkpIHsKICAgICAgICBVOjpiYXIoKTsKICAgIH0KICAgIHN0YXRpYyB2b2lkIGZvb19pbXBsKC4uLikge30KfTsKCmludCBtYWluKCkgewogICAgWDxBPjo6Zm9vKCk7CiAgICBYPEI+Ojpmb28oKTsKICAgIFg8Qz46OmZvbygpOwp9Cg==