diff --git a/include/boost/bind/protect.hpp b/include/boost/bind/protect.hpp index 749e158..d6a480d 100644 --- a/include/boost/bind/protect.hpp +++ b/include/boost/bind/protect.hpp @@ -2,10 +2,10 @@ #define BOOST_BIND_PROTECT_HPP_INCLUDED // -// protect.hpp +// protect.hpp // -// Copyright (c) 2002 Peter Dimov and Multi Media Ltd. -// Copyright (c) 2009 Steven Watanabe +// Copyright 2002, 2020 Peter Dimov +// Copyright 2009 Steven Watanabe // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at @@ -13,7 +13,8 @@ // #include -#include +#include +#include namespace boost { @@ -21,8 +22,41 @@ namespace boost namespace _bi { +#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_DECLTYPE) + template class protected_bind_t { +private: + + F f_; + +public: + + typedef typename F::result_type result_type; + + explicit protected_bind_t( F f ): f_( f ) + { + } + + template auto operator()( A&&... a ) -> decltype( f_( std::forward(a)... ) ) + { + return f_( std::forward(a)... ); + } + + template auto operator()( A&&... a ) const -> decltype( f_( std::forward(a)... ) ) + { + return f_( std::forward(a)... ); + } +}; + +#else + +template class protected_bind_t +{ +private: + + F f_; + public: typedef typename F::result_type result_type; @@ -286,12 +320,10 @@ public: } #endif - -private: - - F f_; }; +#endif + } // namespace _bi template _bi::protected_bind_t protect(F f)