#include <iostream>
#include <utility>

template<typename T, typename U = typename T::type>    //デフォルト引数あり
    std::true_type     test(int);
    
template<typename T>
    std::false_type    test(long);

template<typename T>
    struct Test : decltype(test<T>(0))  {};

struct have  { typedef char type; };
struct nhave { typedef char tYPe; };

int main() {
	std::cout << "Test<have>::value = "  << Test<have>::value << std::endl;
	std::cout << "Test<nhave>::value = "  << Test<nhave>::value << std::endl;
	return 0;
}