📄 bind_functions.hpp
字号:
// -- bind_functions.hpp -- Boost Lambda Library
//
// Copyright (C) 1999, 2000 Jaakko J鋜vi (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_HPP
namespace 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_T
template <class Result>
inline const
lambda_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 const
lambda_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 const
lambda_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 const
lambda_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 const
lambda_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 const
lambda_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_T
template <class Result, class Par1, class Arg2>
inline const
lambda_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 const
lambda_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 const
lambda_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 const
lambda_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 const
lambda_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 const
lambda_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_T
template <class Result, class Par1, class Par2, class Arg2, class Arg3>
inline const
lambda_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 const
lambda_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 const
lambda_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 const
lambda_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 const
lambda_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 const
lambda_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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -