C++可變參數模板實現輸出


C++11 tuple&可變參數模板

 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 }
View Code

    在上面的代碼中,我們先定義了一個只有一個模板參數的函數模板,它簡單地輸出傳入的參數的值。然后又定義了一個可變參數的函數模板,它輸出第一個參數的 值,然后遞歸地調用自己。注意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 }
View Code
    上述代碼實現的功能針對可變參數模板的應用,當然不會像printf函數那么健壯,MyPrint識別格式化參數的標志就是%+下一位字符,如 果條件滿足的話就從Args參數中獲取參數包分割后的第一個參數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM