選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

39 行
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
  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
  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<
  27. comparable_equal<T>::value &&
  28. comparable_equal<U>::value &&
  29. comparable_equal<common_type<T, U>>::value>
  30. { };
  31. }
  32. }
  33. }