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 + -
显示快捷键?