可变模板参数解包

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 )