所以我有一个简单的问题,结果比我预想的要困难得多。
代码:
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
。我想知道是否有人知道如何帮助我解决这个问题。据我所知,似乎函数调用顺序与参数包扩展顺序相反。我理解正确吗?
提前致谢!
答案 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);
}
现在确实有效,但如果有人有更好的解决方案,请发布。干杯!