From e653eb3e8b00785eb49cc3c600e3b0867e4ed0a2 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sun, 24 May 2020 06:14:18 +0300 Subject: [PATCH] Use an internal forward_from_tuple as the std:: one isn't constexpr in C++11 or libstdc++ 5 --- include/boost/mp11/tuple.hpp | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/include/boost/mp11/tuple.hpp b/include/boost/mp11/tuple.hpp index 5475211..ae74303 100644 --- a/include/boost/mp11/tuple.hpp +++ b/include/boost/mp11/tuple.hpp @@ -93,48 +93,54 @@ template BOOST_MP11_CONSTEXPR F tuple_for_each( Tp && tp, F & namespace detail { -template -BOOST_MP11_CONSTEXPR auto tp_extract( Tp&&... tp ) - -> decltype( std::forward_as_tuple( std::get( std::forward( tp ) )... ) ) +// std::forward_as_tuple is not constexpr in C++11 or libstdc++ 5.x +template BOOST_MP11_CONSTEXPR auto tp_forward_r( T&&... t ) -> std::tuple { - return std::forward_as_tuple( std::get( std::forward( tp ) )... ); + return std::tuple( std::forward( t )... ); } -template BOOST_MP11_CONSTEXPR auto tp_forward( T&&... t ) -> std::tuple +template BOOST_MP11_CONSTEXPR auto tp_forward_v( T&&... t ) -> std::tuple { return std::tuple( std::forward( t )... ); } +template +BOOST_MP11_CONSTEXPR auto tp_extract( Tp&&... tp ) + -> decltype( tp_forward_r( std::get( std::forward( tp ) )... ) ) +{ + return tp_forward_r( std::get( std::forward( tp ) )... ); +} + #if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) template BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp&&... tp ) - -> decltype( tp_forward( tuple_apply( f, tp_extract( std::forward(tp)... ) )... ) ) + -> decltype( tp_forward_v( tuple_apply( f, tp_extract( std::forward(tp)... ) )... ) ) { - return tp_forward( tuple_apply( f, tp_extract( std::forward(tp)... ) )... ); + return tp_forward_v( tuple_apply( f, tp_extract( std::forward(tp)... ) )... ); } #else template BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp1&& tp1 ) - -> decltype( tp_forward( f( std::get( std::forward(tp1) ) )... ) ) + -> decltype( tp_forward_v( f( std::get( std::forward(tp1) ) )... ) ) { - return tp_forward( f( std::get( std::forward(tp1) ) )... ); + return tp_forward_v( f( std::get( std::forward(tp1) ) )... ); } template BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp1&& tp1, Tp2&& tp2 ) - -> decltype( tp_forward( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ) )... ) ) + -> decltype( tp_forward_v( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ) )... ) ) { - return tp_forward( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ) )... ); + return tp_forward_v( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ) )... ); } template BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp1&& tp1, Tp2&& tp2, Tp3&& tp3 ) - -> decltype( tp_forward( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ), std::get( std::forward(tp3) ) )... ) ) + -> decltype( tp_forward_v( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ), std::get( std::forward(tp3) ) )... ) ) { - return tp_forward( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ), std::get( std::forward(tp3) ) )... ); + return tp_forward_v( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ), std::get( std::forward(tp3) ) )... ); } #endif // !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 )