首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可变模板参数解包

可变模板参数解包
EN

Stack Overflow用户
提问于 2013-03-08 00:51:02
回答 3查看 2.9K关注 0票数 3

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

代码语言:javascript
复制
obj.apply(someFilter(arg)); // arg is one argument, but here
                            // should be an unpacking of args

我不知道如何为这样的箱子写拆包。

我看到了这个:

代码语言:javascript
复制
 pass{([&]{ std::cout << args << std::endl; }(), 1)...};

on wiki,但同样不知道如何将其应用到我的案例中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-08 00:53:54

这实际上很简单:你可以把任意表达式放在一个可变模板参数包的解包中:

代码语言:javascript
复制
obj.apply(someFilter(arg))...

这将以coma分离列表的形式给出obj.apply的结果。然后,您可以将其传递给一个伪函数:

代码语言:javascript
复制
template<typename... Args> swallow (Args&&...) {}
swallow(obj.apply(someFilter(arg))...);

接受逗号分隔的列表。

当然,这假设obj.apply返回某种类型的对象。如果没有,您可以使用

代码语言:javascript
复制
swallow((obj.apply(someFilter(arg)), 0)...);

创建实际(非void)参数

如果您不知道obj.apply`返回的内容(result可能重载了逗号运算符),则可以使用以下命令禁用自定义逗号运算符

代码语言:javascript
复制
swallow((obj.apply(someFilter(arg)), void(),  0)...);

如果您确实需要按顺序计算项(从问题中看,这似乎不太可能),您可以滥用数组初始化语法,而不是使用函数调用:

代码语言:javascript
复制
using Alias=char[];
Alias{ (apply(someFilter(args)), void(), '\0')... };
票数 4
EN

Stack Overflow用户

发布于 2013-03-08 01:08:37

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

代码语言:javascript
复制
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,它会从前到后对它们进行评估。

票数 1
EN

Stack Overflow用户

发布于 2013-03-08 00:53:37

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

代码语言:javascript
复制
obj.apply( someFilter( arg )... );

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15276991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档