Variadic模板包扩展 [英] Variadic template pack expansion

查看:1342
本文介绍了Variadic模板包扩展的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图学习可变参数模板和函数。我不能undestand,为什么这个代码不编译:

I trying to learn variadic templates and functions. I can't undestand, why this code doesn't compile:

template<typename T>
static void bar(T t) {}

template<typename... Args>
static void foo2(Args... args)
{
    (bar(args)...);
}

int main()
{
    foo2(1, 2, 3, "3");
    return 0;    
}

编译失败,错误为:


错误c3520:'args':参数包必须在此上下文中扩展

error c3520: 'args': parameter pack must be expanded in this context

参数包只能在函数 foo2 中扩展。

(in function foo2).

推荐答案

一个严格定义的上下文列表,而operator 不是其中之一。换句话说,不可能使用包扩展来生成由一系列由运算符定界的子表达式组成的表达式。

Parameter packs can only be expanded in a strictly-defined list of contexts, and operator , is not one of them. In other words, it's not possible to use pack expansion to generate an expression consisting of a series of subexpressions delimited by operator ,.

经验法则是扩展可以生成分隔模式的列表 code>是一个列表分隔符。

The rule of thumb is "Expansion can generate a list of ,-separated patterns where , is a list delimiter." Operator , does not construct a list in the grammar sense.

要为每个参数调用一个函数,可以使用,使用递归(这是可变模板程序员框中的主要工具):

To call a function for each argument, you can use recursion (which is the primary tool in the variadic template programmer's box):

template <typename T>
void bar(T t) {}

void foo2() {}

template <typename Car, typename... Cdr>
void foo2(Car car, Cdr... cdr)
{
  bar(car);
  foo2(cdr...);
}

int main()
{
  foo2 (1, 2, 3, "3");
}

生活示例

这篇关于Variadic模板包扩展的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆