所以我有一个简单的问题,结果证明比我预期的要难得多。
法典:
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);
}
它现在确实有效,但如果有人有更好的解决方案,请发布它。干杯!