2017-07-18 45 views
1

这是cppreference的示例。我不明白模式如何扩展。省略号出现在模板函数的参数声明中

template<typename ...Ts, int... N> void g(Ts (&...arr)[N]) {} 
int n[1]; 
g<const char, int>("a", n); // Ts (&...arr)[N] expands to 
          // const char (&)[2], int(&)[1] 

Note: In the pattern Ts (&...arr)[N], the ellipsis is the innermost element, not the last element as in all other pack expansions. 

问题1:什么是ARR?

问题2:n是一个int数组,它是否与int ... N匹配?

问题3:为什么它可以扩展为const char(&)[2],INT(&)[1]

+0

查看有关包扩展的任何问题,例如[this one](https://stackoverflow.com/a/26767333/2069064) – Barry

+0

要解决问题2:'Ts'是数组类型的类型包,而'N'是数组维数的一个int数据包,所以'n'将'int'类型提供到'Ts'包中,并将维度1提供到'N'包中。 – cdhowie

+0

使用可变参数模板引用C数组的丑陋语法('int(&a)[42]')。 – Jarod42

回答

3

鉴于

template <typename ...Ts> void f(Ts&...arr); 

主要是相当于

template <typename T0, typename T1, .., typename TN> 
void f(T0& arr0, T1& arr1, .., TN& arrN); 

任何N

以相同的方式,

template <typename ...Ts, int... Ns> void g(Ts (&...arr)[Ns]); 

将相当于

template <typename T0, typename T1, .., typename TN, int N0, int N1, .. int NN> 
void g(T0 (&arr0)[N0], T1 (&arr1)[N1], .., TN (&arrN)[NN]); 

并键入T (&)[N]是一个参考尺寸N的C-阵列型的元件T

int n[1];简单的是int [1]

"a"const char[2]{'a', '\0'})类型。

+0

A:void g(T0(&arr0)[N0],T1(&arr1)[N1],..,TN(&arrN)[NN]) ; B:g (“a”,n); 我可以理解你的答案,但是A怎么和B匹配?谢谢 – Jerry

+0

所以如果T0 = const char和T1 = int,那么N0和N1是什么? 2和1来自扩展结果的位置在哪里? – Jerry

+0

@Jerry:编辑。 ''a“'不是'const char *',而是'const char [2]'。 – Jarod42