省略号出现在模板函数

时间:2017-07-18 00:59:48

标签: c++ templates generic-programming

这是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(&amp;)[2],int(&amp;)[1]

1 个答案:

答案 0 :(得分: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'})。