问题
我有很多C ++函数 void f()
, R g(T a)
, S h(U a, V b)
等等。我想写一个接受的模板函数 f
, g
, h
等等 模板参数 并调用该函数。
即 我想要这样的东西:
template<MagicStuff, WrappedFunction>
ReturnType wrapper(MagicallyCorrectParams... params)
{
extra_processing(); // Extra stuff that the wrapper adds
return WrappedFunction(params);
}
...
wrapper<f>(); // calls f
wrapper<g>(T()); // calls g
wrapper<h>(U(), V()); // calls h
这是我到目前为止所尝试的内容:
解决方案1
template<typename ReturnType, typename Args...>
ReturnType wrapper(ReturnType (*wrappee)(Args...), Args... args)
{
extra_processing();
return wrappee(args...);
}
...
wrapper(f); // calls f OK
wrapper(g, T()); // calls g OK
wrapper(h, U(), V()); // calls h OK
这有效,但不能令人满意,因为在我的情况下,我希望函数指针绑定到模板实例。函数指针在编译时是静态可确定的,在我的用例中不希望在运行时将其作为参数传递。
解决方案2
template<
typename ReturnType, typename Args...,
ReturnType (*FuncPtr)(Args...)
>
wrapper(Args... args)
{
extra_processing();
return FuncPtr(args...);
}
...
wrapper<void, f>(); // calls f
wrapper<R, T, g>(T()); // calls g
wrapper<S, U, V, h>(U(), V()); // calls h
这有效但不令人满意,因为它很冗长。返回类型和参数类型可以从函数指针本身推导出来。什么是完美的模板规范,所以我可以做 wrapper<g>(T())
如上所述。
谢谢大家的帮助!