diff --git a/include/boost/tuple_for_each.hpp b/include/boost/tuple_for_each.hpp index 2d2d135..8e3d766 100644 --- a/include/boost/tuple_for_each.hpp +++ b/include/boost/tuple_for_each.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -20,6 +21,15 @@ template BOOST_CONSTEXPR F tuple_for_each_i return (void)A{ ((void)f(std::get(std::forward(tp))), 0)... }, std::forward(f); } +#if BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) + +template BOOST_CONSTEXPR F tuple_for_each_impl( Tp && tp, boost::integer_sequence, F && f ) +{ + return std::forward(f); +} + +#endif + } // namespace detail template BOOST_CONSTEXPR F tuple_for_each( Tp && tp, F && f ) diff --git a/test/tuple_for_each.cpp b/test/tuple_for_each.cpp index 97de4a7..e8880dd 100644 --- a/test/tuple_for_each.cpp +++ b/test/tuple_for_each.cpp @@ -91,5 +91,19 @@ int main() } } + { + std::tuple<> tp; + + BOOST_TEST_EQ( boost::tuple_for_each( tp, 11 ), 11 ); + BOOST_TEST_EQ( boost::tuple_for_each( std::move( tp ), 12 ), 12 ); + } + + { + std::array tp; + + BOOST_TEST_EQ( boost::tuple_for_each( tp, 11 ), 11 ); + BOOST_TEST_EQ( boost::tuple_for_each( std::move( tp ), 12 ), 12 ); + } + return boost::report_errors(); } diff --git a/test/tuple_for_each_cx.cpp b/test/tuple_for_each_cx.cpp index c3accb4..85189d0 100644 --- a/test/tuple_for_each_cx.cpp +++ b/test/tuple_for_each_cx.cpp @@ -31,9 +31,17 @@ struct assert_is_integral int main() { - constexpr std::tuple tp{ 1, 2, 3 }; - constexpr auto r = boost::tuple_for_each( tp, assert_is_integral() ); - (void)r; + { + constexpr std::tuple tp{ 1, 2, 3 }; + constexpr auto r = boost::tuple_for_each( tp, assert_is_integral() ); + (void)r; + } + + { + constexpr std::tuple<> tp; + constexpr auto r = boost::tuple_for_each( tp, 11 ); + static_assert( r == 11, "r == 11" ); + } } #endif