gpt4 book ai didi

函数执行器中的 C++ 歧义,参数在 vector 中传递

转载 作者:行者123 更新时间:2023-11-28 05:01:21 25 4
gpt4 key购买 nike

我与这个可变参数模板斗争了很长时间。有人可以帮我吗?我想构建一个能够调用 cmath 函数并通过 vector 传递其所有参数的执行器。请考虑以下代码:

bool execute(const std::string &functionName, const std::vector<double> &params)
{
if (functionName == "cos") return execute(cos, params);
if (functionName == "atan2") return execute(atan2, params);
return false;
}

函数 cos 接受一个参数,而 atan2 接受两个参数。我想要这样的东西:

template <typename... Types>
bool execute(double (*func)(Types...), const std::vector<double> &params)
{
if (params.size() != sizeof...(Types)) {
errorString = "Wrong number of function arguments";
return false;
}

errno = 0;
result = func(params[0]);
errorString = strerror(errno);
return !errno;
}

但是,我遇到了两个问题:

  1. 函数 cos 适用于 doublefloat,因此调用不明确。此外,我不能使用 double 代替 typename 来强制执行它。还是有别的办法?
  2. 当我尝试调用函数 func 时,如何根据函数类型从 vector 中指定正确数量的参数?

或者也许有一些我不知道的 C++ 中已经可用的东西? :) 非常感谢!

最佳答案

你可以使用 std::index_sequence,像这样:

template <typename... Types, std::size_t ... Is>
double execute(double (*func)(Types...),
const std::vector<double> &params,
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> &params)
{
return execute(func, params, std::index_sequence_for<Types...>());
}

并调用它(指定模板参数以修复重载)。

double execute(const std::string &functionName, const std::vector<double> &params)
{
if (functionName == "cos") return (execute<double>)(cos, params);
if (functionName == "atan2") return (execute<double, double>)(atan2, params);
throw std::runtime_error("Unknown function name");
}

关于函数执行器中的 C++ 歧义,参数在 vector 中传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45862728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com