以错误的顺序将函数应用于参数包中的每个元素
Applying function to each element in parameter pack happening in wrong order
所以我有一个简单的问题,结果证明比我预期的要难得多。
法典:
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);
}
它现在确实有效,但如果有人有更好的解决方案,请发布它。干杯!
相关文章:
- 参数包中的筛选器类型
- enable_if中参数包的大小问题
- 实例化模板时,我是否必须显式显示参数包中的类型?
- C++ 在可变参数模板的参数包中并集参数?
- 如何检测参数包中的uint8_t类型
- 如何在 C# 中将带有参数的函数绑定到包中
- 从函数参数包中删除最后一项
- C++:我可以在模板参数包中强制执行至少1个agment吗
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 从参数包中排除前 n 个参数
- 如何在参数包中找到最大值
- 是否可以使用 Boost.Hana 将 std::array 解压缩到非类型模板参数包中
- 如何更改参数包中的最后一个参数
- 从参数包中派生的调用基类运算符 =
- C++17:对参数包中的模板进行通用(基于多重继承?)检查
- 如何获取参数包中元素的索引
- 如何从模板类的可变参数包中的每个类型恢复非类型名模板参数?
- 对参数包中的每个元素应用函数
- 如何检查参数包中的每个类型是否唯一