Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

38 строки
860 B

  1. #pragma once
  2. #include <cpputils/mp/misc/when.h>
  3. #include <cpputils/mp/misc/tag_of.h>
  4. namespace utl {
  5. namespace mp {
  6. namespace __impl /* forward declaration */
  7. {
  8. template<typename Tag, typename ...T>
  9. struct is_a_impl;
  10. }
  11. template<typename Tag, typename... T>
  12. constexpr __impl::is_a_impl<Tag, T...> is_a { };
  13. template<typename Tag, typename... T>
  14. constexpr __impl::is_a_impl<Tag, T...> is_an { };
  15. namespace __impl /* implementation */
  16. {
  17. template<typename Tag, typename T>
  18. struct is_a_impl<Tag, T> :
  19. public is_same<Tag, tag_of<T>>
  20. { };
  21. template<typename Tag>
  22. struct is_a_impl<Tag>
  23. {
  24. template<typename T>
  25. constexpr auto operator()(const T&) const noexcept
  26. { return is_a<Tag, T>; }
  27. };
  28. }
  29. }
  30. }