你可以使用
std::index_sequence
,类似于:
template <typename... Types, std::size_t ... Is>
double execute(double (*func)(Types...),
const std::vector<double> ¶ms,
std::index_sequence<Is...>)
{
if (params.size() != sizeof...(Types)) {
throw std::runtime_error("Wrong number of function arguments");
}
return func(params[Is]...);
}
template <typename... Types>
double execute(double (*func)(Types...), const std::vector<double> ¶ms)
{
return execute(func, params, std::index_sequence_for<Types...>());
}
并调用它(指定模板参数以修复重载)。
double execute(const std::string &functionName, const std::vector<double> ¶ms)
{
if (functionName == "cos") return (execute<double>)(cos, params);
if (functionName == "atan2") return (execute<double, double>)(atan2, params);
throw std::runtime_error("Unknown function name");
}