bind_functions.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 1,880 行 · 第 1/4 页
HPP
1,880 行
// -- bind_functions.hpp -- Boost Lambda Library//// Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)//// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)//// For more information, see http://www.boost.org// ----------------------------------------------------------------#ifndef BOOST_LAMBDA_BIND_FUNCTIONS_HPP#define BOOST_LAMBDA_BIND_FUNCTIONS_HPPnamespace boost { namespace lambda {#ifdef BOOST_LAMBDA_INCORRECT_BIND_OVERLOADING // gcc 2.96 instantiates bind functions it does not even call. // These instantiations lead to incorrect types in the return type, // and a compilation error results. // This tweaking is to prevent the formation of the erroneous type.namespace detail {template<class T> struct constify_non_funcs { typedef typename detail::IF_type<boost::is_function<T>::value, boost::add_reference<T>, boost::add_const<T> >::type type;};}#endif// 1-argument bind functions --------------------------#ifndef BOOST_REF_TO_FUNC_CONFLICTS_WITH_REF_TO_Ttemplate <class Result>inline constlambda_functor< lambda_functor_base< action<1, function_action<1, Result> >, typename detail::bind_tuple_mapper<Result(&)()>::type >>bind(Result(& a1)()) { return lambda_functor_base< action<1, function_action<1, Result> >, typename detail::bind_tuple_mapper<Result(&)()>::type > ( typename detail::bind_tuple_mapper<Result(&)()>::type (a1) );}#endif #ifndef BOOST_LAMBDA_INCORRECT_BIND_OVERLOADING template <class Arg1>inline constlambda_functor< lambda_functor_base< action<1, function_action<1> >, typename detail::bind_tuple_mapper<const Arg1>::type >>bind(const Arg1& a1) { return lambda_functor_base< action<1, function_action<1> >, typename detail::bind_tuple_mapper<const Arg1>::type > ( typename detail::bind_tuple_mapper<const Arg1>::type (a1) );}template <class Result, class Arg1>inline constlambda_functor< lambda_functor_base< action<1, function_action<1, Result> >, typename detail::bind_tuple_mapper<const Arg1>::type >>bind(const Arg1& a1) { return lambda_functor_base< action<1, function_action<1, Result> >, typename detail::bind_tuple_mapper<const Arg1>::type > ( typename detail::bind_tuple_mapper<const Arg1>::type (a1) );} #else template <class Arg1>inline constlambda_functor< lambda_functor_base< action<1, function_action<1> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type >::type >>bind(const Arg1& a1) { return lambda_functor_base< action<1, function_action<1> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type >::type > ( typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type >::type (a1) );}template <class Result, class Arg1>inline constlambda_functor< lambda_functor_base< action<1, function_action<1, Result> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type >::type >>bind(const Arg1& a1) { return lambda_functor_base< action<1, function_action<1, Result> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type >::type > ( typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type >::type (a1) );}template <class Result>inline constlambda_functor< lambda_functor_base< action<1, function_action<1, Result> >, typename detail::bind_tuple_mapper<Result(*)()>::type >>bind(Result(* const & a1)()) { return lambda_functor_base< action<1, function_action<1, Result> >, typename detail::bind_tuple_mapper<Result(*)()>::type > ( typename detail::bind_tuple_mapper<Result(*)()>::type (a1) );}#endif // 2-argument bind functions --------------------------#ifndef BOOST_REF_TO_FUNC_CONFLICTS_WITH_REF_TO_Ttemplate <class Result, class Par1, class Arg2>inline constlambda_functor< lambda_functor_base< action<2, function_action<2, Result> >, typename detail::bind_tuple_mapper<Result(&)(Par1), const Arg2>::type >>bind(Result(&a1)(Par1), const Arg2& a2) { return lambda_functor_base< action<2, function_action<2, Result> >, typename detail::bind_tuple_mapper<Result(&)(Par1), const Arg2>::type > ( typename detail::bind_tuple_mapper<Result(&)(Par1), const Arg2>::type (a1, a2) );}#endif#ifndef BOOST_LAMBDA_INCORRECT_BIND_OVERLOADING template <class Arg1, class Arg2>inline constlambda_functor< lambda_functor_base< action<2, function_action<2> >, typename detail::bind_tuple_mapper<const Arg1, const Arg2>::type >>bind(const Arg1& a1, const Arg2& a2) { return lambda_functor_base< action<2, function_action<2> >, typename detail::bind_tuple_mapper<const Arg1, const Arg2>::type > ( typename detail::bind_tuple_mapper<const Arg1, const Arg2>::type (a1, a2) );}template <class Result, class Arg1, class Arg2>inline constlambda_functor< lambda_functor_base< action<2, function_action<2, Result> >, typename detail::bind_tuple_mapper<const Arg1, const Arg2>::type >>bind(const Arg1& a1, const Arg2& a2) { return lambda_functor_base< action<2, function_action<2, Result> >, typename detail::bind_tuple_mapper<const Arg1, const Arg2>::type > ( typename detail::bind_tuple_mapper<const Arg1, const Arg2>::type (a1, a2) );} #else template <class Arg1, class Arg2>inline constlambda_functor< lambda_functor_base< action<2, function_action<2> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2 >::type >>bind(const Arg1& a1, const Arg2& a2) { return lambda_functor_base< action<2, function_action<2> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2 >::type > ( typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2 >::type (a1, a2) );}template <class Result, class Arg1, class Arg2>inline constlambda_functor< lambda_functor_base< action<2, function_action<2, Result> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2 >::type >>bind(const Arg1& a1, const Arg2& a2) { return lambda_functor_base< action<2, function_action<2, Result> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2 >::type > ( typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2 >::type (a1, a2) );}template <class Result, class Par1, class Arg2>inline constlambda_functor< lambda_functor_base< action<2, function_action<2, Result> >, typename detail::bind_tuple_mapper<Result(*)(Par1), const Arg2>::type >>bind(Result(* const & a1)(Par1), const Arg2& a2) { return lambda_functor_base< action<2, function_action<2, Result> >, typename detail::bind_tuple_mapper<Result(*)(Par1), const Arg2>::type > ( typename detail::bind_tuple_mapper<Result(*)(Par1), const Arg2>::type (a1, a2) );} #endif // 3-argument bind functions --------------------------#ifndef BOOST_REF_TO_FUNC_CONFLICTS_WITH_REF_TO_Ttemplate <class Result, class Par1, class Par2, class Arg2, class Arg3>inline constlambda_functor< lambda_functor_base< action<3, function_action<3, Result> >, typename detail::bind_tuple_mapper< Result(&)(Par1, Par2), const Arg2, const Arg3 >::type >>bind(Result(&a1)(Par1, Par2), const Arg2& a2, const Arg3& a3) { return lambda_functor_base< action<3, function_action<3, Result> >, typename detail::bind_tuple_mapper< Result(&)(Par1, Par2), const Arg2, const Arg3 >::type > ( typename detail::bind_tuple_mapper< Result(&)(Par1, Par2), const Arg2, const Arg3 >::type (a1, a2, a3) );}#endif #ifndef BOOST_LAMBDA_INCORRECT_BIND_OVERLOADING template <class Arg1, class Arg2, class Arg3>inline constlambda_functor< lambda_functor_base< action<3, function_action<3> >, typename detail::bind_tuple_mapper< const Arg1, const Arg2, const Arg3 >::type >>bind(const Arg1& a1, const Arg2& a2, const Arg3& a3) { return lambda_functor_base< action<3, function_action<3> >, typename detail::bind_tuple_mapper< const Arg1, const Arg2, const Arg3 >::type > ( typename detail::bind_tuple_mapper< const Arg1, const Arg2, const Arg3 >::type (a1, a2, a3) );}template <class Result, class Arg1, class Arg2, class Arg3>inline constlambda_functor< lambda_functor_base< action<3, function_action<3, Result> >, typename detail::bind_tuple_mapper< const Arg1, const Arg2, const Arg3 >::type >>bind(const Arg1& a1, const Arg2& a2, const Arg3& a3) { return lambda_functor_base< action<3, function_action<3, Result> >, typename detail::bind_tuple_mapper< const Arg1, const Arg2, const Arg3 >::type > ( typename detail::bind_tuple_mapper< const Arg1, const Arg2, const Arg3 >::type (a1, a2, a3) );} #else template <class Arg1, class Arg2, class Arg3>inline constlambda_functor< lambda_functor_base< action<3, function_action<3> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2, const Arg3 >::type >>bind(const Arg1& a1, const Arg2& a2, const Arg3& a3) { return lambda_functor_base< action<3, function_action<3> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2, const Arg3 >::type > ( typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2, const Arg3 >::type (a1, a2, a3) );}template <class Result, class Arg1, class Arg2, class Arg3>inline constlambda_functor< lambda_functor_base< action<3, function_action<3, Result> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2, const Arg3 >::type >>bind(const Arg1& a1, const Arg2& a2, const Arg3& a3) { return lambda_functor_base< action<3, function_action<3, Result> >, typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2, const Arg3 >::type > ( typename detail::bind_tuple_mapper< typename detail::constify_non_funcs<Arg1>::type, const Arg2, const Arg3 >::type (a1, a2, a3) );}template <class Result, class Par1, class Par2, class Arg2, class Arg3>inline constlambda_functor< lambda_functor_base< action<3, function_action<3, Result> >, typename detail::bind_tuple_mapper< Result(*)(Par1, Par2), const Arg2, const Arg3 >::type >>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?