
1 template 2 3 void Print(T value) 4 5 { 6 7 std::cout << value << std::endl; 8 9 } 10 11 template 12 13 void Print(Head head, Rail... rail) 14 15 { 16 17 std::cout << head << ", "; 18 19 Print(rail...); 20 21 } 22 23 int main(int argc, _TCHAR* argv[]) 24 25 { 26 27 Print(1); 28 29 Print("hello", 1); 30 31 Print(1, "hello"); 32 33 Print(1, "hello", 'H'); 34 35 getchar(); 36 37 return 0; 38 39 }
在上面的代碼中,我們先定義了一個只有一個模板參數的函數模板,它簡單地輸出傳入的參數的值。然后又定義了一個可變參數的函數模板,它輸出第一個參數的 值,然后遞歸地調用自己。注意rail...這種寫法,它表示將函數參數包分割成一個一個的參數,並傳入Print中。這樣,函數參數包中的第一個參數傳 遞給head,剩余的參數又重新構成一個函數參數包傳遞給rail。當遞歸調用到函數參數包中只有一個參數時,則會調用只有一個模板參數的Print函 數。
理解了可變模板參數的使用原理后,我們再來編寫一個自己的Printf函數。

1 void MyPrint(const char * pszText) 2 3 { 4 5 ASSERT(pszText != nullptr); 6 7 std::cout << pszText; 8 9 } 10 11 template 12 13 void MyPrint(const char * pszText, T value, Args... args) 14 15 { 16 17 assert(pszText != nullptr); 18 19 while (*pszText) 20 21 { 22 23 if (*pszText == '%' && *++pszText != '%') 24 25 { 26 27 std::cout << value; 28 29 MyPrint(++pszText, args...); 30 31 return; 32 33 } 34 35 std::cout << *pszText++; 36 37 } 38 39 } 40 41 int _tmain(int argc, _TCHAR* argv[]) 42 43 { 44 45 MyPrint(nullptr); 46 47 MyPrint("hello"); 48 49 getchar(); 50 51 return 0; 52 53 }