1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- #ifndef BOOST_TYPE_TRAITS_DETAIL_MP_DEFER_HPP_INCLUDED
- #define BOOST_TYPE_TRAITS_DETAIL_MP_DEFER_HPP_INCLUDED
- //
- // Copyright 2015 Peter Dimov
- //
- // Distributed under the Boost Software License, Version 1.0.
- // See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt
- //
- #include <boost/type_traits/integral_constant.hpp>
- #include <boost/type_traits/conditional.hpp>
- namespace boost
- {
- namespace type_traits_detail
- {
- // mp_valid
- // implementation by Bruno Dutra (by the name is_evaluable)
- template<template<class...> class F, class... T>
- struct mp_valid_impl
- {
- template<template<class...> class G, class = G<T...>>
- static boost::true_type check_s(int);
- template<template<class...> class>
- static boost::false_type check_s(...);
- using type = decltype(check_s<F>(0));
- };
- template<template<class...> class F, class... T>
- using mp_valid = typename mp_valid_impl<F, T...>::type;
- // mp_defer
- struct mp_empty
- {
- };
- template<template<class...> class F, class... T> struct mp_defer_impl
- {
- using type = F<T...>;
- };
- template<template<class...> class F, class... T> using mp_defer = typename boost::conditional<mp_valid<F, T...>::value, mp_defer_impl<F, T...>, mp_empty>::type;
- } // namespace type_traits_detail
- } // namespace boost
- #endif // #ifndef BOOST_TYPE_TRAITS_DETAIL_MP_DEFER_HPP_INCLUDED
|