24 #include <type_traits>
33 class F,
class... Args,
34 class =
typename std::enable_if<!std::is_member_function_pointer<F>::value>::type,
35 class = typename std::enable_if<!std::is_member_object_pointer<F>::value>::type
37 auto
eval(F&& f, Args&&... args) -> decltype(f(std::forward<Args>(args)...))
39 return std::forward<F>(f)(std::forward<Args>(args)...);
43 template<
class R,
class C,
class... Args>
44 auto eval(R(C::*f)()
const,
const C& c, Args&&... args) -> R
46 return (c.*f)(std::forward<Args>(args)...);
50 template<
class R,
class C,
class... Args>
51 auto eval(R(C::*f)()
const, C& c, Args&&... args) -> R
53 return (c.*f)(std::forward<Args>(args)...);
57 template<
class R,
class C,
class... Args>
58 auto eval(R(C::*f)(), C& c, Args&&... args) -> R
60 return (c.*f)(std::forward<Args>(args)...);
64 template<
class R,
class C>
65 auto eval(R(C::*m),
const C& c) ->
const R&
71 template<
class R,
class C>
72 auto eval(R(C::*m), C& c) -> R&
77 template<
class... Args>
decltype(eval(std::declval< Args >()...)) eval_result_type
auto eval(F &&f, Args &&...args) -> decltype(f(std::forward< Args >(args)...))