1
0
forked from boostorg/mp11

Use alternative implementation of mp_valid for Intel C++

This commit is contained in:
Peter Dimov
2018-01-18 22:24:31 +02:00
parent b725dd6e68
commit c2f8024305

View File

@@ -10,7 +10,7 @@
#include <boost/mp11/integral.hpp> #include <boost/mp11/integral.hpp>
#include <boost/config.hpp> #include <boost/config.hpp>
#include <boost/detail/workaround.hpp> #include <boost/config/workaround.hpp>
namespace boost namespace boost
{ {
@@ -53,6 +53,28 @@ template<bool C, class T, class... E> using mp_if_c = typename detail::mp_if_c_i
template<class C, class T, class... E> using mp_if = typename detail::mp_if_c_impl<static_cast<bool>(C::value), T, E...>::type; template<class C, class T, class... E> using mp_if = typename detail::mp_if_c_impl<static_cast<bool>(C::value), T, E...>::type;
// mp_valid // mp_valid
#if BOOST_WORKAROUND(BOOST_INTEL, BOOST_TESTED_AT(1800))
// contributed by Roland Schulz in https://github.com/boostorg/mp11/issues/17
namespace detail
{
template<class...> using void_t = void;
template<class, template<class...> class F, class... T>
struct mp_valid_impl: mp_false {};
template<template<class...> class F, class... T>
struct mp_valid_impl<void_t<F<T...>>, F, T...>: mp_true {};
} // namespace detail
template<template<class...> class F, class... T> using mp_valid = typename detail::mp_valid_impl<void, F, T...>;
#else
// implementation by Bruno Dutra (by the name is_evaluable) // implementation by Bruno Dutra (by the name is_evaluable)
namespace detail namespace detail
{ {
@@ -69,6 +91,8 @@ template<template<class...> class F, class... T> struct mp_valid_impl
template<template<class...> class F, class... T> using mp_valid = typename detail::mp_valid_impl<F, T...>::type; template<template<class...> class F, class... T> using mp_valid = typename detail::mp_valid_impl<F, T...>::type;
#endif
// mp_defer // mp_defer
namespace detail namespace detail
{ {