From b51b52dea9b58c12a93f3bb077ec35f5ce280da9 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Tue, 22 Aug 2017 10:03:26 -0600 Subject: [PATCH] constexpr bind_first --- include/chaiscript/dispatchkit/any.hpp | 2 +- include/chaiscript/dispatchkit/bind_first.hpp | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/chaiscript/dispatchkit/any.hpp b/include/chaiscript/dispatchkit/any.hpp index e9af7c36..32ccdf89 100644 --- a/include/chaiscript/dispatchkit/any.hpp +++ b/include/chaiscript/dispatchkit/any.hpp @@ -82,7 +82,7 @@ namespace chaiscript { public: // construct/copy/destruct - Any() noexcept = default; + constexpr Any() noexcept = default; Any(Any &&) = default; Any &operator=(Any &&t_any) = default; diff --git a/include/chaiscript/dispatchkit/bind_first.hpp b/include/chaiscript/dispatchkit/bind_first.hpp index 8495e3c3..d0a668fb 100644 --- a/include/chaiscript/dispatchkit/bind_first.hpp +++ b/include/chaiscript/dispatchkit/bind_first.hpp @@ -31,25 +31,25 @@ namespace chaiscript } template - auto bind_first(Ret (*f)(P1, Param...), O&& o) + constexpr auto bind_first(Ret (*f)(P1, Param...), O&& o) { - return [f, o](Param...param) -> Ret { - return f(std::forward(o), std::forward(param)...); + return [f, o = std::forward(o)](Param...param) -> Ret { + return f(o, std::forward(param)...); }; } template - auto bind_first(Ret (Class::*f)(Param...), O&& o) + constexpr auto bind_first(Ret (Class::*f)(Param...), O&& o) { - return [f, o](Param...param) -> Ret { + return [f, o = std::forward(o)](Param...param) -> Ret { return (get_pointer(o)->*f)(std::forward(param)...); }; } template - auto bind_first(Ret (Class::*f)(Param...) const, O&& o) + constexpr auto bind_first(Ret (Class::*f)(Param...) const, O&& o) { - return [f, o](Param...param) -> Ret { + return [f, o = std::forward(o)](Param...param) -> Ret { return (get_pointer(o)->*f)(std::forward(param)...); }; @@ -58,22 +58,22 @@ namespace chaiscript template auto bind_first(const std::function &f, O&& o) { - return [f, o](Param...param) -> Ret { + return [f, o = std::forward(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) + constexpr 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), f](Param ...param) -> Ret { return (fo.*f)(o, std::forward(param)...); }; } template - auto bind_first(const F &f, O&& o) + constexpr auto bind_first(const F &f, O&& o) { return bind_first(f, std::forward(o), &F::operator()); }