#include <iostream>
#include <type_traits>
using namespace std;
struct a { void test(); };
struct b {};
template <typename T>
struct HasTest{
template<typename R, typename S = decltype(declval<R>().test())> static true_type Test(R*);
template<typename R> static false_type Test(...);
using def = decltype(Test<T>(0));
};
template <typename T>
void foo() {
cout << conditional_t<HasTest<T>::def::value, true_type, false_type>::value << endl;
}
int main() {
foo<a>();
foo<b>();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgYSB7IHZvaWQgdGVzdCgpOyB9OwpzdHJ1Y3QgYiB7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgSGFzVGVzdHsKCXRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFMgPSBkZWNsdHlwZShkZWNsdmFsPFI+KCkudGVzdCgpKT4gc3RhdGljIHRydWVfdHlwZSBUZXN0KFIqKTsKCXRlbXBsYXRlPHR5cGVuYW1lIFI+IHN0YXRpYyBmYWxzZV90eXBlIFRlc3QoLi4uKTsKCXVzaW5nIGRlZiA9IGRlY2x0eXBlKFRlc3Q8VD4oMCkpOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgZm9vKCkgewoJY291dCA8PCBjb25kaXRpb25hbF90PEhhc1Rlc3Q8VD46OmRlZjo6dmFsdWUsIHRydWVfdHlwZSwgZmFsc2VfdHlwZT46OnZhbHVlIDw8IGVuZGw7Cn0KCmludCBtYWluKCkgewoJZm9vPGE+KCk7Cglmb288Yj4oKTsKfQ==