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

53 строки
1.6 KiB

  1. #pragma once
  2. namespace utl {
  3. namespace mp {
  4. namespace __impl /* forward declaration */
  5. {
  6. template<bool C, typename T, typename E>
  7. struct if_c_impl;
  8. template<bool C, typename T, template<typename...> class E, typename... A>
  9. struct eval_if_c_impl;
  10. }
  11. template<typename T, typename S = void>
  12. using enable_if = typename std::enable_if<T::value, S>::type;
  13. template<bool B, typename S = void>
  14. using enable_if_c = typename std::enable_if<B, S>::type;
  15. template<typename B, typename T, typename E>
  16. using if_t = typename __impl::if_c_impl<B::value != 0, T, E>::type;
  17. template<bool B, typename T, typename E>
  18. using if_c = typename __impl::if_c_impl<B, T, E>::type;
  19. template<typename C, typename T, template<typename...> class E, typename... A>
  20. using eval_if_t = typename __impl::eval_if_c_impl<C::value != 0, T, E, A...>::type;
  21. template<bool C, typename T, template<typename...> class E, typename... A>
  22. using eval_if_c = typename __impl::eval_if_c_impl<C, T, E, A...>::type;
  23. namespace __impl /* implementation */
  24. {
  25. template<typename T, typename F>
  26. struct if_c_impl<true, T, F>
  27. { using type = T; };
  28. template<typename T, typename F>
  29. struct if_c_impl<false, T, F>
  30. { using type = F; };
  31. template<typename T, template<typename...> class E, typename... A>
  32. struct eval_if_c_impl<true, T, E, A...>
  33. { using type = T; };
  34. template<typename T, template<typename...> class E, typename... A>
  35. struct eval_if_c_impl<false, T, E, A...>
  36. { using type = E<A...>; };
  37. }
  38. }
  39. }