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

时间:2013-12-04 05:24:59

标签: c++ c++11 tuples callstack string-parsing

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

代码:

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。我想知道是否有人知道如何帮助我解决这个问题。据我所知,似乎函数调用顺序与参数包扩展顺序相反。我理解正确吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

所以我想出了一些东西,虽然它不是最漂亮的但确实有效。我创建了一个函数,用一个字符串构建一个指定类型的元组,然后我用它来代替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);
}

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