fork download
  1. #include <iostream>
  2.  
  3.  
  4. // void_t: void type alias
  5. template< typename... >
  6. using void_t = void;
  7. //
  8.  
  9.  
  10. namespace internal
  11. {
  12. // Fallback case
  13. template< typename D,
  14. typename Void,
  15. template< typename... > class Check,
  16. typename... Args
  17. >
  18. struct detect_impl
  19. {
  20. using value_t = std::false_type;
  21. using type = D;
  22. };
  23.  
  24.  
  25. // Check succeeded
  26. template< typename D,
  27. template< typename... > class Check,
  28. typename... Args
  29. >
  30. struct detect_impl
  31. < D, void_t< Check<Args...> >, Check, Args... >
  32. {
  33. using value_t = std::true_type;
  34. using type = Check<Args...>;
  35. };
  36. }
  37.  
  38. // Type representing a missing type.
  39. struct nonesuch
  40. {
  41. nonesuch() = delete;
  42. ~nonesuch() = delete;
  43. nonesuch(nonesuch const&) = delete;
  44. void operator=(nonesuch const&) = delete;
  45. };
  46.  
  47.  
  48. template< template< typename... > class Check,
  49. typename... Args
  50. >
  51. using is_detected = typename internal::detect_impl< nonesuch, void, Check, Args... >::value_t;
  52.  
  53.  
  54.  
  55. // Our test
  56. template< typename T >
  57. using is_addable_impl = decltype( std::declval<T>() + std::declval<T>() );
  58.  
  59. template< typename T >
  60. using is_addable = is_detected<is_addable_impl, T>;
  61.  
  62.  
  63. auto main(int argc, const char* arv[])
  64. -> int
  65. {
  66. std::cout << std::boolalpha
  67. << is_addable<int>::value << ", "
  68. << is_addable<nonesuch>::value << std::endl;
  69. }
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
true, false