From 1e584048ceb777fabf9aa7207dee939e36bcdf51 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Sat, 9 Apr 2016 21:00:07 -0600 Subject: [PATCH] Remove std::function from bind_first --- include/chaiscript/dispatchkit/bind_first.hpp | 53 +++++++++++-------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/include/chaiscript/dispatchkit/bind_first.hpp b/include/chaiscript/dispatchkit/bind_first.hpp index fcba534..98da1de 100644 --- a/include/chaiscript/dispatchkit/bind_first.hpp +++ b/include/chaiscript/dispatchkit/bind_first.hpp @@ -27,45 +27,52 @@ namespace chaiscript } template - std::function bind_first(Ret (*f)(P1, Param...), O&& o) + auto bind_first(Ret (*f)(P1, Param...), O&& o) { - return std::function( - [f, o](Param...param) -> Ret { - return f(std::forward(o), std::forward(param)...); - } - ); + return [f, o](Param...param) -> Ret { + return f(std::forward(o), std::forward(param)...); + }; } template - std::function bind_first(Ret (Class::*f)(Param...), O&& o) + auto bind_first(Ret (Class::*f)(Param...), O&& o) { - return std::function( - [f, o](Param...param) -> Ret { - return (get_pointer(o)->*f)(std::forward(param)...); - } - ); + return [f, o](Param...param) -> Ret { + return (get_pointer(o)->*f)(std::forward(param)...); + }; } template - std::function bind_first(Ret (Class::*f)(Param...) const, O&& o) + auto bind_first(Ret (Class::*f)(Param...) const, O&& o) { - return std::function( - [f, o](Param...param) -> Ret { - return (get_pointer(o)->*f)(std::forward(param)...); - } - ); + return [f, o](Param...param) -> Ret { + return (get_pointer(o)->*f)(std::forward(param)...); + }; } template - std::function bind_first(const std::function &f, O&& o) + auto bind_first(const std::function &f, O&& o) { - return std::function( - [f, o](Param...param) -> Ret { - return f(o, std::forward(param)...); - }); + return [f, o](Param...param) -> Ret { + return f(o, std::forward(param)...); + }; } + template + auto bind_first(const F &fo, O&& o, Ret (Class::*f)(P1, Param...) const) + { + return [fo, o, f](Param ...param) -> Ret { + return (fo.*f)(o, std::forward(param)...); + }; + + } + + template + auto bind_first(const F &f, O&& o) + { + return bind_first(f, std::forward(o), &F::operator()); + } } }