2016-04-09 60 views
0

雖然試圖理解可變參數模板的概念。我遇到了這個例子。這對我來說似乎是一個簡單的例子。不能理解這個可變參數模板的例子

void output() --------->function A 
{ cout << "This is the results\n"; } 

template <typename T, typename ...P> 
void output(T t, P ...p) ------->functionB 
{ 
    cout << t << ' '; 
{ 
    output(p...); ------>statement A 
} 

} 


//Test it 
int main() 
{ 
    output('5', 2); 

    return(0); 
} 

現在上述程序的輸出是:

5 2 This is the results 

這裏有一些問題,我不得不對此例如:

1)什麼是陳述一個電話?它是否調用函數A?但它似乎只是調用一次?此方法在其簽名中沒有任何參數?我是怎麼5 2 This is the results在上面的例子中,作爲輸出

2)是什麼意思時,提交人指出,可變參數類是遞歸的,因此他們需要一個基類

+2

您沒有仔細閱讀。這是「基本案例」,而不是「基礎課程」。 –

+2

我認爲這應該涵蓋在可變參數模板的任何教程中,不是嗎? – juanchopanza

回答

1

請更改您的例子:

int g = 0; 

void output() { cout << "This is the results\n"; } 

template <typename T, typename ...P> 
void output(T t, P ...p) 
{ 
    cout << "\n\tg = " << g++ << endl; 
    cout << t << ' '; 
    { 
    output(p...); 
    } 
} 

的輸出將是:

g = 0 
5 
g = 1 
2 This is the results 

因此,當調用輸出( '5',2); 編譯器將生成的代碼是什麼將做以下操作:

void output(char c, int x) 
{ 
    cout << c << ' '; 
    output(x); 
} 

然後,它會「遞歸」生成功能:

void output(int x) { 
    cout << x << ' '; 
    output(); 
} 

對於「)無效輸出(」您已經定義的基本情況:

void output() { cout << "This is the results\n"; } 

因此編譯器將使用它來代替從模板生成代碼。

+0

感謝您的解釋。這清除了它 –

1

1)什麼是聲明呼叫?它是否調用函數A?但它似乎只有一次調用它嗎?另外該方法在其簽名中沒有任何 參數?我怎麼會5 2這是 上述例子的結果作爲輸出

當你調用這樣的功能:

output('5', 2); 

t == '5'...p將是剩餘參數這僅2

void output(T t, P ...p) 
//   '5' { 2 } 

你然後打印第一類型char

cout << t << ' '; 
//  '5' 

然後你再次調用該函數(遞歸)與參數的休息:

output(p...); // p is only {2} 

同樣,你只打印出數2

cout << t << ' '; 
//  2 

而且沒有任何爭論,並且它會調用基本情況:

void output() 
+0

感謝您的偉大答案。而你的答案更具信息性。我必須標記Vadims的答案,因爲它早些時候發佈。他給了我一個關於如何解決問題的線索,我不得不到繪圖板去找出它並進行實驗。讀出答案證實了我的發現,並且它更容易理解。我非常感謝你打電話給我,並發表了一篇很好的簡短的解釋。 –