fork download
  1. #include <tuple>
  2. #include <vector>
  3. #include <array>
  4. #include <cstdint>
  5. #include <iostream>
  6.  
  7. namespace cpp98
  8. {
  9. namespace detail
  10. {
  11. template <typename T>
  12. T declval();
  13. }
  14.  
  15. template <typename T>
  16. struct is_copy_assignable
  17. {
  18. private:
  19.  
  20. typedef char One;
  21. typedef struct { char a[2]; } Two;
  22.  
  23. template <int N = sizeof(detail::declval<T&>() = detail::declval<T const&>())>
  24. static One try_assign(int);
  25.  
  26. static Two try_assign(...);
  27.  
  28. public:
  29.  
  30. typedef typename std::conditional<sizeof(try_assign(0)) == sizeof(One),
  31. std::true_type, std::false_type>::type type;
  32. };
  33. }
  34.  
  35. namespace cpp11
  36. {
  37. template <typename T>
  38. struct is_copy_assignable
  39. {
  40. private:
  41. template <typename U, typename = decltype(std::declval<T&>() = std::declval<T const&>())>
  42. static std::true_type try_assign(U&&);
  43.  
  44. static std::false_type try_assign(...);
  45.  
  46. public:
  47. using type = decltype(try_assign(std::declval<T>()));
  48. };
  49. }
  50.  
  51. namespace cpp1y
  52. {
  53. template <typename ... Args>
  54. struct voider
  55. {
  56. typedef void type;
  57. };
  58.  
  59. template <typename ... Args>
  60. using void_t = typename voider<Args...>::type;
  61.  
  62. template <typename T, typename = void>
  63. struct has_type_member : std::false_type
  64. {};
  65.  
  66. template <typename T>
  67. struct has_type_member<T, void_t<typename T::type>> : std::true_type
  68. {};
  69.  
  70. template <typename T, typename = void>
  71. struct is_copy_assignable : std::false_type
  72. {};
  73.  
  74. template <typename T>
  75. struct is_copy_assignable<T, void_t<decltype(std::declval<T&>() = std::declval<T const&>())>> : std::true_type
  76. {};
  77. }
  78.  
  79. class Foo
  80. {
  81. public:
  82. Foo() {}
  83. public:
  84. Foo(Foo const& rhs) = delete;
  85. Foo& operator= (Foo const& rhs) = delete;
  86. };
  87.  
  88. int main()
  89. {
  90. bool result;
  91. result = cpp98::is_copy_assignable<Foo>::type::value;
  92. std::cout << result << std::endl;
  93. result = cpp11::is_copy_assignable<Foo>::type::value;
  94. std::cout << result << std::endl;
  95. result = cpp1y::is_copy_assignable<Foo>::type::value;
  96. std::cout << result << std::endl;
  97.  
  98. return 0;
  99. }
Success #stdin #stdout 0s 3140KB
stdin
Standard input is empty
stdout
0
0
0