From c2f8024305c012deb95e4787f64ccc006b8a71e0 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Thu, 18 Jan 2018 22:24:31 +0200 Subject: [PATCH] Use alternative implementation of mp_valid for Intel C++ --- include/boost/mp11/utility.hpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/include/boost/mp11/utility.hpp b/include/boost/mp11/utility.hpp index 5935e6d..4fd98e1 100644 --- a/include/boost/mp11/utility.hpp +++ b/include/boost/mp11/utility.hpp @@ -10,7 +10,7 @@ #include #include -#include +#include namespace boost { @@ -53,6 +53,28 @@ template using mp_if_c = typename detail::mp_if_c_i template using mp_if = typename detail::mp_if_c_impl(C::value), T, E...>::type; // 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 using void_t = void; + +template class F, class... T> +struct mp_valid_impl: mp_false {}; + +template class F, class... T> +struct mp_valid_impl>, F, T...>: mp_true {}; + +} // namespace detail + +template class F, class... T> using mp_valid = typename detail::mp_valid_impl; + +#else + // implementation by Bruno Dutra (by the name is_evaluable) namespace detail { @@ -69,6 +91,8 @@ template class F, class... T> struct mp_valid_impl template class F, class... T> using mp_valid = typename detail::mp_valid_impl::type; +#endif + // mp_defer namespace detail {