C++ 可变模板参数解包

C++ 可变模板参数解包,c++,templates,variadic-templates,C++,Templates,Variadic Templates,对于每个参数,我需要应用两个嵌套函数: obj.apply(someFilter(arg)); // arg is one argument, but here // should be an unpacking of args template<typename... Args> swallow (Args&&...) {} swallow(obj.apply(someFilter(arg))...); 我

对于每个参数,我需要应用两个嵌套函数:

obj.apply(someFilter(arg)); // arg is one argument, but here
                            // should be an unpacking of args
template<typename... Args> swallow (Args&&...) {}
swallow(obj.apply(someFilter(arg))...);
我不知道如何为这种情况写解包

我看到了:

 pass{([&]{ std::cout << args << std::endl; }(), 1)...};

pass{([&]{std::cout我假设代码有多个
arg
s作为参数包?尝试:

obj.apply( someFilter( arg )... );

由于参数解包应用于表达式,因此参数包get的每个元素都被扩展为
someFilter(arg)

,实际上非常简单: 您可以将任意表达式放入变量模板参数包的解包中:

obj.apply(someFilter(arg))...
这将为您提供
obj的结果。将
作为一个单独的列表应用。然后您可以将其传递给一个伪函数:

obj.apply(someFilter(arg)); // arg is one argument, but here
                            // should be an unpacking of args
template<typename... Args> swallow (Args&&...) {}
swallow(obj.apply(someFilter(arg))...);
使实际(非
无效
)参数

如果不知道obj.apply`返回什么(结果可能重载了逗号运算符),可以使用

swallow((obj.apply(someFilter(arg)), void(),  0)...);
如果您确实需要按顺序计算项目(从问题来看,这似乎不太可能),您可以滥用数组初始化语法,而不是使用函数调用:

using Alias=char[];
Alias{ (apply(someFilter(args)), void(), '\0')... };

以下是一种对参数包执行任意操作的健壮方法。它遵循最小意外的原则,并按顺序执行操作:

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)));}... );
}
模板
按顺序无效(Lambda和Lambda、Lambdas和Lambdas)
{
标准:正向(λ)();
按顺序进行(标准:向前(lambdas)…);
}
void do_in_order(){}
模板
无效测试(Args&&Args){
按顺序执行([&](){obj.apply(someFilter(std::forward(args));};
}

基本上,您在
do_处按顺序发送一堆lambda
,前后对它们进行计算。

当您说unpacking时,是不是意味着您的单个参数“arg”应该解压为多个参数?Error-expression包含未展开的参数包“args”Error-expected“;”expression@user14416现在还冷吗我在编辑时给出了这个错误?我不小心在完成之前发布了答案。请注意,上面要求
obj.apply
返回非void,并按未指定的顺序计算参数。@Yakk:不,不需要(需要非void).I在您编写注释时正在编辑OK,现在如果
obj.apply
返回一个带有重写的
运算符的对象,
,则上述操作会导致意外行为。