3

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

obj.apply(someFilter(arg)); // arg is one argument, but here
                            // should be an unpacking of args

我不知道如何为这种情况编写拆包。

我看到了这个:

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

在 wiki 上,但又不知道如何将其应用于我的案例。

4

3 回答 3

4

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

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(), '\0')... };
于 2013-03-07T16:53:53.890 回答
1

这是对参数包执行任意一组操作的可靠方法。它遵循最小意外原则,并按顺序执行操作:

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 do_in_order,它从前到后评估它们。

于 2013-03-07T17:08:36.633 回答
0

我假设代码有多个args 作为参数包?尝试:

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

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

于 2013-03-07T16:53:36.930 回答