Преобразование макроса переменной в функцию шаблона переменной?
Дан переменный макрос вида:
#define MY_CALL_RETURN_F(FType, FId, ...) \
if(/*prelude omitted*/) { \
FType f = (FType)GetFuncFomId(FId); \
if(f) { \
return f(__VA_ARGS__); \
} else { \
throw invalid_function_id(FId); \
} \
} \
/**/
Как это можно переписать в шаблон функции Variadic?
template<typename FType, typename ...Args>
/*return type?*/ tmpl_call_return_f(MyFunId const& FId, /*what goes here?*/)
{
...
FType f = (FType)GetFuncFomId(FId);
return f(/*what goes here?*/);
...
}
Обновление: меня особенно интересует, как объявить ссылочный тип для Args
: &&
или же const&
или что?
Обновление: обратите внимание, что FType должен быть "простым" указателем на функцию.
2 ответа
Решение
Это будет выглядеть примерно так:
template<typename FType, typename ...Args>
std::result_of<FType(Args...)>::type tmpl_call_return_f(MyFunId const& FId, Args... &&args)
{
FType f = (FType)GetFuncFomId(FId)
return f(std::forward<Args>(args)...);
}
Если вы используете std::function
как FType
тогда это должно работать:
template <typename FType, typename ...Args>
typename FType::result_type tmpl_call_return_f(MyFunId const& FId, Args... args) {
// ...
return f(args...);
}