可变模板参数解包
variadic template arguments unpacking
本文关键字:参数 更新时间:2023-10-16
对于每个参数,我需要应用两个嵌套函数:
obj.apply(someFilter(arg)); // arg is one argument, but here
// should be an unpacking of args
对于这种情况,我不知道如何写拆包。
I saw this:
pass{([&]{ std::cout << args << std::endl; }(), 1)...};
在wiki上,但是我还是不知道如何应用这个
其实很简单:您可以将任意表达式放入可变模板参数包的解包中:
obj.apply(someFilter(arg))...
这将以逗号分隔列表的形式给出obj.apply
的结果。然后您可以将它传递给一个虚拟函数:
template<typename... Args> swallow (Args&&...) {}
swallow(obj.apply(someFilter(arg))...);
吞下逗号分隔的列表。
当然,这里假设obj.apply
返回某种对象。如果没有,可以使用
swallow((obj.apply(someFilter(arg)), 0)...);
生成实际(非void
)参数
如果你不知道obj。Apply ` `返回(结果可能重载了逗号操作符),可以使用
禁用自定义逗号操作符swallow((obj.apply(someFilter(arg)), void(), 0)...);
如果您确实需要按顺序计算项(从问题中似乎不太可能),您可以滥用数组初始化语法,而不是使用函数调用:
using Alias=char[];
Alias{ (apply(someFilter(args)), void(), ' ')... };
这是一种对参数包执行任意操作集的健壮方法。它遵循最小意外原则,并按顺序执行操作:
template<typename Lambda, typename Lambdas>
void do_in_order( Lambda&& lambda, Lambdas&& lambdas )
{
std::forward<Lambda>(lambda)();
do_in_order( std::forward<Lambdas>(lambdas)... );
}
void do_in_order() {}
template<typename Args>
void test( Args&& args ) {
do_in_order( [&](){obj.apply(someFilter(std::forward<Args>(args)));}... );
}
基本上,您在do_in_order
发送一堆lambda,它从前到后对它们进行评估。
我假设代码有多个arg
s作为参数包?试一试:
obj.apply( someFilter( arg )... );
作为参数解包应用于表达式,因此参数包中的每个元素都展开为someFilter( arg )
。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用