Merge pull request #604 from CanftIn/release-6.x

Fix first param forward by value in bind_first.
This commit is contained in:
Rob Loach 2022-11-03 00:13:43 -04:00 committed by GitHub
commit 6939982a0d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -33,15 +33,15 @@ namespace chaiscript
template<typename O, typename Ret, typename P1, typename ... Param> template<typename O, typename Ret, typename P1, typename ... Param>
auto bind_first(Ret (*f)(P1, Param...), O&& o) auto bind_first(Ret (*f)(P1, Param...), O&& o)
{ {
return [f, o](Param...param) -> Ret { return [f, o = std::forward<O>(o)](Param...param) -> Ret {
return f(std::forward<O>(o), std::forward<Param>(param)...); return f(o, std::forward<Param>(param)...);
}; };
} }
template<typename O, typename Ret, typename Class, typename ... Param> template<typename O, typename Ret, typename Class, typename ... Param>
auto bind_first(Ret (Class::*f)(Param...), O&& o) auto bind_first(Ret (Class::*f)(Param...), O&& o)
{ {
return [f, o](Param...param) -> Ret { return [f, o = std::forward<O>(o)](Param...param) -> Ret {
return (detail::get_pointer(o)->*f)(std::forward<Param>(param)...); return (detail::get_pointer(o)->*f)(std::forward<Param>(param)...);
}; };
} }
@ -49,7 +49,7 @@ namespace chaiscript
template<typename O, typename Ret, typename Class, typename ... Param> template<typename O, typename Ret, typename Class, typename ... Param>
auto bind_first(Ret (Class::*f)(Param...) const, O&& o) auto bind_first(Ret (Class::*f)(Param...) const, O&& o)
{ {
return [f, o](Param...param) -> Ret { return [f, o = std::forward<O>(o)](Param...param) -> Ret {
return (detail::get_pointer(o)->*f)(std::forward<Param>(param)...); return (detail::get_pointer(o)->*f)(std::forward<Param>(param)...);
}; };
@ -58,7 +58,7 @@ namespace chaiscript
template<typename O, typename Ret, typename P1, typename ... Param> template<typename O, typename Ret, typename P1, typename ... Param>
auto bind_first(const std::function<Ret (P1, Param...)> &f, O&& o) auto bind_first(const std::function<Ret (P1, Param...)> &f, O&& o)
{ {
return [f, o](Param...param) -> Ret { return [f, o = std::forward<O>(o)](Param...param) -> Ret {
return f(o, std::forward<Param>(param)...); return f(o, std::forward<Param>(param)...);
}; };
} }
@ -66,7 +66,7 @@ namespace chaiscript
template<typename F, typename O, typename Ret, typename Class, typename P1, typename ... Param> template<typename F, typename O, typename Ret, typename Class, typename P1, typename ... Param>
auto bind_first(const F &fo, O&& o, Ret (Class::*f)(P1, Param...) const) auto bind_first(const F &fo, O&& o, Ret (Class::*f)(P1, Param...) const)
{ {
return [fo, o, f](Param ...param) -> Ret { return [fo, o = std::forward<O>(o), f](Param ...param) -> Ret {
return (fo.*f)(o, std::forward<Param>(param)...); return (fo.*f)(o, std::forward<Param>(param)...);
}; };