template<class F_before, class F, class F_after>
struct decorate_func_t {
F_before f0;
F f1;
F_after f2;
template<class...Args>
typename std::result_of<F(Args...)>::type operator()(Args&&...args)const{
f0();
auto r = f1(std::forward<Args>(args)...);
f2();
return r;
}
};
template<class F_before, class F, class F_after>
decorate_func_t<F_before, F, F_after>
decorate_func(F_before before, F f, F_after after){
return {std::move(before), std::move(f), std::move(after)};
}
然後:
template <typename F, typename Args...>
inline auto runFunc(F func) -> foo
{
return foo(decorate_func(
[]{/* Do something before calling func */},
func,
[]{/* Do something after call func */ }
};
}
在C++ 11缺乏auto
參數lambdas使得你可以做的最好。
在C++ 14這個很簡單:
template <class F>
auto runFunc(F func)
{
return foo(
[func](auto&&... args) // ->decltype(auto) maybe
{
// Do something before calling func
auto r = func(decltype(args)(args)...);
// Do something after call func
return r;
}
);
}
注意,很多名義上是C++ 11編譯器實際上支持lambda表達式auto
參數。
你能提供更多關於你想要做什麼的背景嗎? – templatetypedef
'runFunc(F func)'後的' - > foo'沒有任何意義。試試'decltype(foo([func](Args ... args)'...'))' – Czipperz
什麼是'foo()'?你只是想裝飾'func'? – Barry