fork(2) download
  1. #include <iostream>
  2. #include <type_traits>
  3. #include <string>
  4. #include <utility>
  5.  
  6.  
  7. #define create_trait(trait_name, ...)\
  8. std::true_type trait_name##_sfinae(std::decay_t<decltype(__VA_ARGS__)> *);\
  9. template <typename...> std::false_type trait_name##_sfinae(...);\
  10. template <typename... Ts> struct trait_name : decltype(trait_name##_sfinae<Ts...>(nullptr)) {};
  11.  
  12. template <typename T>
  13. create_trait(has_member_type, std::declval<typename T::type>());
  14.  
  15. template <typename... Ts>
  16. create_trait(have_common_type, std::declval<std::common_type_t<Ts...>>());
  17.  
  18. template <typename T1, typename T2>
  19. create_trait(less_than_comparable, std::declval<T1>() < std::declval<T2>());
  20.  
  21. struct test { using type = void; };
  22.  
  23. int main()
  24. {
  25. std::cout << has_member_type<int>::value << std::endl;
  26. std::cout << has_member_type<test>::value << std::endl;
  27. std::cout << have_common_type<int, char, bool>::value << std::endl;
  28. std::cout << have_common_type<int, char, std::string>::value << std::endl;
  29. std::cout << less_than_comparable<int, char>::value << std::endl;
  30. std::cout << less_than_comparable<int, std::string>::value << std::endl;
  31. return 0;
  32. }
Success #stdin #stdout 0s 3140KB
stdin
Standard input is empty
stdout
0
1
1
0
1
0