From f4b3414e621a1613b3152a3e3d6357121ccf9a55 Mon Sep 17 00:00:00 2001 From: Dmitry Arkhipov Date: Mon, 26 Jul 2021 21:10:05 +0300 Subject: [PATCH] Add support for n-ary functions to mp_compose --- doc/mp11/utility.adoc | 2 +- include/boost/mp11/utility.hpp | 8 +++++--- test/mp_compose.cpp | 13 +++++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/doc/mp11/utility.adoc b/doc/mp11/utility.adoc index d5bb622..7a9777a 100644 --- a/doc/mp11/utility.adoc +++ b/doc/mp11/utility.adoc @@ -295,7 +295,7 @@ As `mp_not_fn`, but takes a quoted metafunction. `mp_compose` is a quoted metafunction that applies `F1`, `F2`, ..., `Fn` to its argument, in sequence. That is, -`mp_compose::fn` is `Fn<...F2>...>`. +`mp_compose::fn` is `Fn<...F2>...>`. ## mp_compose_q diff --git a/include/boost/mp11/utility.hpp b/include/boost/mp11/utility.hpp index 533009a..b3fa7a9 100644 --- a/include/boost/mp11/utility.hpp +++ b/include/boost/mp11/utility.hpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include namespace boost @@ -233,7 +235,7 @@ template using mp_not_fn_q = mp_not_fn; namespace detail { -template using mp_reverse_invoke_q = mp_invoke_q; +template using mp_compose_helper = mp_list< mp_apply_q >; } // namespace detail @@ -241,14 +243,14 @@ template using mp_reverse_invoke_q = mp_invoke_q; template class... F> struct mp_compose { - template using fn = mp_fold...>, T, detail::mp_reverse_invoke_q>; + template using fn = mp_front< mp_fold...>, mp_list, detail::mp_compose_helper> >; }; #endif template struct mp_compose_q { - template using fn = mp_fold, T, detail::mp_reverse_invoke_q>; + template using fn = mp_front< mp_fold, mp_list, detail::mp_compose_helper> >; }; } // namespace mp11 diff --git a/test/mp_compose.cpp b/test/mp_compose.cpp index 46184a6..57a86ed 100644 --- a/test/mp_compose.cpp +++ b/test/mp_compose.cpp @@ -4,6 +4,7 @@ // https://www.boost.org/LICENSE_1_0.txt +#include #include #include @@ -15,6 +16,8 @@ template using G1 = F1; template using G2 = F2; template using G3 = F3; +template struct H {}; + int main() { using namespace boost::mp11; @@ -32,6 +35,10 @@ int main() BOOST_TEST_TRAIT_TRUE((std::is_same::fn, F3>>>)); BOOST_TEST_TRAIT_TRUE((std::is_same::fn, F3>>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same::fn, H>)); + BOOST_TEST_TRAIT_TRUE((std::is_same::fn, F1>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same::fn, G1>>>)); + #endif using QF1 = mp_quote; @@ -42,6 +49,8 @@ int main() using QG2 = mp_quote; using QG3 = mp_quote; + using QH = mp_quote; + BOOST_TEST_TRAIT_TRUE((std::is_same::fn, void>)); BOOST_TEST_TRAIT_TRUE((std::is_same::fn, F1>)); @@ -53,6 +62,10 @@ int main() BOOST_TEST_TRAIT_TRUE((std::is_same::fn, F3>>>)); BOOST_TEST_TRAIT_TRUE((std::is_same::fn, F3>>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same::fn, H>)); + BOOST_TEST_TRAIT_TRUE((std::is_same::fn, F1>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same::fn, G1>>>)); + // return boost::report_errors();