#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>();
}