对于每个参数,我需要应用两个嵌套函数:
obj.apply(someFilter(arg)); // arg is one argument, but here
// should be an unpacking of args
我不知道如何为这种情况写解包。
我看到了这个:
pass{([&]{ std::cout << args << std::endl; }(), 1)...};
on wiki,但又不知道如何在我的情况下应用此功能。
答案 0 :(得分:4)
实际上非常简单: 您可以将任意表达式放在variadic templates参数包的解压缩包中:
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')... };
答案 1 :(得分:0)
我假设代码有多个arg
s作为参数包?尝试:
obj.apply( someFilter( arg )... );
因为参数解包适用于表达式,所以参数包的每个元素都被扩展为someFilter( arg )
。
答案 2 :(得分: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)));}... );
}
基本上,你在do_in_order
发送一堆lambdas,从前到后对它们进行评估。