У меня есть ряд функций c ++ void f () , r g (t a) , s h (u a, v b) и так далее. Я хочу написать функцию шаблона, которая принимает f , g , h и так далее как аргумент шаблон и вызывает эту функцию.
template
ReturnType wrapper(MagicallyCorrectParams... params)
{
extra_processing(); // Extra stuff that the wrapper adds
return WrappedFunction(params);
}
...
wrapper(); // calls f
wrapper(T()); // calls g
wrapper(U(), V()); // calls h
< /code>
Вот что я пробовал до сих пор: < /h1>
Решение 1 < /h2>
template
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
< /code>
Это работает, но является неудовлетворительным, потому что в моем случае я хочу, чтобы указатель функции был связан с экземпляром шаблона. Указатель функции определяется статически во время компиляции, и в моем случае использование нежелательно передать его в качестве параметра во время выполнения.template<
typename ReturnType, typename Args...,
ReturnType (*FuncPtr)(Args...)
>
wrapper(Args... args)
{
extra_processing();
return FuncPtr(args...);
}
...
wrapper(); // calls f
wrapper(T()); // calls g
wrapper(U(), V()); // calls h
< /code>
Это работает, но является неудовлетворительным, потому что это словесно. Тип возврата и типы параметров могут быть выведены из самого указателя функции. Что было бы идеальным, так это спецификация шаблона, поэтому я могу сделать обертку (t ())
У меня есть ряд функций c ++ void f () , r g (t a) , s h (u a, v b) и так далее. Я хочу написать функцию шаблона, которая принимает f , g , h и так далее как аргумент шаблон и вызывает эту функцию.[code]template ReturnType wrapper(MagicallyCorrectParams... params) { extra_processing(); // Extra stuff that the wrapper adds return WrappedFunction(params); } ... wrapper(); // calls f wrapper(T()); // calls g wrapper(U(), V()); // calls h < /code>
Вот что я пробовал до сих пор: < /h1>
Решение 1 < /h2>
template 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 < /code>
Это работает, но является неудовлетворительным, потому что в моем случае я хочу, чтобы указатель функции был связан с экземпляром шаблона. Указатель функции определяется статически во время компиляции, и в моем случае использование нежелательно передать его в качестве параметра во время выполнения.template< typename ReturnType, typename Args..., ReturnType (*FuncPtr)(Args...) > wrapper(Args... args) { extra_processing(); return FuncPtr(args...); } ... wrapper(); // calls f wrapper(T()); // calls g wrapper(U(), V()); // calls h < /code>
Это работает, но является неудовлетворительным, потому что это словесно. Тип возврата и типы параметров могут быть выведены из самого указателя функции. Что было бы идеальным, так это спецификация шаблона, поэтому я могу сделать обертку (t ()) [/code], как указано выше.
Этот код отклоняется всеми компиляторами, на которых я мог бы его проверить, поэтому я полагаю, что он плохо образуется в соответствии со стандартом. struct X {
void f();
};
Этот код отклоняется всеми компиляторами, на которых я мог бы его проверить, поэтому я полагаю, что он плохо образуется в соответствии со стандартом. struct X {
void f();
};
У меня есть итеративный алгоритм со значениями, специфичными для каждой итерации. Оба суб-алгоритма могут использовать (и изменить) любую из вычисленных переменных состояния до точки, в которой они называются. К стратегиям, но это раздражает меня,...