#ifndef BOOST_COMPAT_BIND_BACK_HPP_INCLUDED #define BOOST_COMPAT_BIND_BACK_HPP_INCLUDED // Copyright 2024 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include #include #include #include namespace boost { namespace compat { namespace detail { #if BOOST_WORKAROUND(BOOST_MSVC, < 1910) # pragma warning(push) # pragma warning(disable: 4100) // 'a': unreferenced formal parameter #endif template static constexpr auto invoke_bind_back_( F&& f, A&& a, index_sequence, B&&... b ) BOOST_COMPAT_RETURNS( compat::invoke( std::forward(f), std::forward(b)..., std::get( std::forward(a) )... ) ) #if BOOST_WORKAROUND(BOOST_MSVC, < 1910) # pragma warning(pop) #endif template class bind_back_ { private: F f_; std::tuple a_; public: template constexpr bind_back_( F2&& f2, A2&&... a2 ): f_( std::forward(f2) ), a_( std::forward(a2)... ) {} public: template BOOST_CXX14_CONSTEXPR auto operator()( B&&... b ) & BOOST_COMPAT_RETURNS( detail::invoke_bind_back_( f_, a_, make_index_sequence(), std::forward(b)... ) ) template constexpr auto operator()( B&&... b ) const & BOOST_COMPAT_RETURNS( detail::invoke_bind_back_( f_, a_, make_index_sequence(), std::forward(b)... ) ) template BOOST_CXX14_CONSTEXPR auto operator()( B&&... b ) && BOOST_COMPAT_RETURNS( detail::invoke_bind_back_( std::move(f_), std::move(a_), make_index_sequence(), std::forward(b)... ) ) template constexpr auto operator()( B&&... b ) const && BOOST_COMPAT_RETURNS( detail::invoke_bind_back_( std::move(f_), std::move(a_), make_index_sequence(), std::forward(b)... ) ) }; } // namespace detail template constexpr auto bind_back( F&& f, A&&... a ) -> detail::bind_back_< decay_t, decay_t... > { return { std::forward(f), std::forward(a)... }; } } // namespace compat } // namespace boost #endif // BOOST_COMPAT_BIND_BACK_HPP_INCLUDED