Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

39 Zeilen
1.3 KiB

  1. #pragma once
  2. #include <utility>
  3. #include <cpputils/mp/core.h>
  4. namespace utl {
  5. namespace mp {
  6. namespace intern {
  7. template<typename T, typename U = T, typename = void>
  8. struct comparable_equal
  9. : c_false_t
  10. { };
  11. template<typename T>
  12. struct comparable_equal<T, T, void_t<
  13. decltype(std::forward<T>(std::declval<T>()) == std::forward<T>(std::declval<T>()) ? 0 : 0),
  14. decltype(std::forward<T>(std::declval<T>()) != std::forward<T>(std::declval<T>()) ? 0 : 0)>>
  15. : c_true_t
  16. { };
  17. template <typename T, typename U>
  18. struct comparable_equal<T, U, enable_if_c<
  19. !is_same<T, U>::value,
  20. void_t<
  21. decltype(std::forward<T>(std::declval<T>()) == std::forward<U>(std::declval<U>()) ? 0 : 0),
  22. decltype(std::forward<U>(std::declval<U>()) == std::forward<T>(std::declval<T>()) ? 0 : 0),
  23. decltype(std::forward<T>(std::declval<T>()) != std::forward<U>(std::declval<U>()) ? 0 : 0),
  24. decltype(std::forward<U>(std::declval<U>()) != std::forward<T>(std::declval<T>()) ? 0 : 0),
  25. common_type<T, U>>>>
  26. : c_bool_t<
  27. comparable_equal<T>::value &&
  28. comparable_equal<U>::value &&
  29. comparable_equal<common_type<T, U>>::value>
  30. { };
  31. }
  32. }
  33. }