以错误的顺序将函数应用于参数包中的每个元素



所以我有一个简单的问题,结果证明比我预期的要难得多。

法典:

template <typename R, typename... Args>
void ApplyString(R(*func)(Args...), std::string args)
{
    auto argtuple = std::make_tuple(GetToken<Args>(args)...);
    typename GetIndexTuple<Args...>::type indices;
    ApplyTuple(func, argtuple, indices);
}

目标:

代码的目标是标记字符串中的每个函数参数。我正在做的是在将参数包(Args...(扩展为元组时应用标记化函数。然后,我使用该函数调用ApplyTuple它所说的那样。它确实有效...有点...

问题:

问题是在make_tuple序列中,首先调用最后一个函数。例如,假设我有一个简单的输出函数:

void Output(int a, int b, int c)
{
    std::cout << a << "," << b << "," << c << "n";
}

然后我像这样使用它:

ApplyString(Output, "10 7 5 ");

预期输出为:10,7,5 。但是实际输出是:5,7,10 。我想知道是否有人知道帮助我解决这个问题的方法。据我了解,函数调用顺序似乎与参数包扩展顺序相反。我理解正确吗?

提前感谢!

所以我想出了一些办法,虽然它不是最漂亮的,但它确实有效。我创建了一个函数来从字符串中构建指定类型的元组,然后我只是使用它来代替make_tuple。

法典:

template <typename Head, typename... Tail>
std::tuple<Head, Tail...> StringToTuple(std::tuple<Head, Tail...>, std::string& args)
{
    auto head = std::make_tuple(GetToken<Head>(args));
    return std::tuple_cat(head, StringToTuple(std::tuple<Tail...>(), args));
}
std::tuple<> StringToTuple(std::tuple<>, std::string& args)
{
    return std::tuple<>();
}
template <typename R, typename... Args>
R ApplyString(std::function<R(Args...)> func, std::string args)
{
    std::tuple<Args...> argtuple = StringToTuple(std::tuple<Args...>(), args);
    return ApplyTuple(func, argtuple);
}

现在确实有效,但如果有人有更好的解决方案,请发布它。干杯!

最新更新