对于每个参数,我需要应用两个嵌套函数:
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,但同样不知道如何将其应用到我的案例中。
发布于 2013-03-08 00:53:54
这实际上很简单:你可以把任意表达式放在一个可变模板参数包的解包中:
obj.apply(someFilter(arg))...这将以coma分离列表的形式给出obj.apply的结果。然后,您可以将其传递给一个伪函数:
template<typename... Args> swallow (Args&&...) {}
swallow(obj.apply(someFilter(arg))...);接受逗号分隔的列表。
当然,这假设obj.apply返回某种类型的对象。如果没有,您可以使用
swallow((obj.apply(someFilter(arg)), 0)...);创建实际(非void)参数
如果您不知道obj.apply`返回的内容(result可能重载了逗号运算符),则可以使用以下命令禁用自定义逗号运算符
swallow((obj.apply(someFilter(arg)), void(), 0)...);如果您确实需要按顺序计算项(从问题中看,这似乎不太可能),您可以滥用数组初始化语法,而不是使用函数调用:
using Alias=char[];
Alias{ (apply(someFilter(args)), void(), '\0')... };发布于 2013-03-08 01:08:37
这是一种在参数包上执行任意一组操作的健壮方法。它遵循最小意外原则,并按顺序执行操作:
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,它会从前到后对它们进行评估。
发布于 2013-03-08 00:53:37
我假设代码有多个arg作为参数包?尝试:
obj.apply( someFilter( arg )... );由于参数解包适用于表达式,因此参数包get的每个元素都展开为someFilter( arg )。
https://stackoverflow.com/questions/15276991
复制相似问题