2017-07-18 70 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