#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
//
#include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
+#include <boost/config/workaround.hpp>
+#include <utility>
namespace boost
{
namespace _bi
{
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_DECLTYPE)
+
+template<class T> struct protect_make_void
+{
+ typedef void type;
+};
+
+template<class F, class E = void> struct protect_result_type
+{
+};
+
+template<class F> struct protect_result_type< F, typename protect_make_void<typename F::result_type>::type >
+{
+ typedef typename F::result_type result_type;
+};
+
+template<class F> class protected_bind_t: public protect_result_type<F>
+{
+private:
+
+ F f_;
+
+public:
+
+ explicit protected_bind_t( F f ): f_( f )
+ {
+ }
+
+ template<class... A> auto operator()( A&&... a ) -> decltype( f_( std::forward<A>(a)... ) )
+ {
+ return f_( std::forward<A>(a)... );
+ }
+
+ template<class... A> auto operator()( A&&... a ) const -> decltype( f_( std::forward<A>(a)... ) )
+ {
+ return f_( std::forward<A>(a)... );
+ }
+};
+
+#else
+
template<class F> class protected_bind_t
{
+private:
+
+ F f_;
+
public:
typedef typename F::result_type result_type;
}
#endif
-
-private:
-
- F f_;
};
+#endif
+
} // namespace _bi
template<class F> _bi::protected_bind_t<F> protect(F f)