Вопрос
У меня есть ряд функций С++ 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())
, как указано выше.
Спасибо за помощь!