C++ 11標準新增加了“可變參數模板”(variadic template)。
可變參數模板中,模板的typename個數是可變長度的。下面給個例子,已在g++ 4.6.1上編譯通過,並成功運行。
/* * C++11標準 可變參數模板(variadic template) 範例 * * * Copyright 葉劍飛 2012 * * * 編譯命令: * g++ myPrintf.cpp -o myPrintf -std=c++0x -Wall * */#include <iostream>#include <cstdlib>#include <stdexcept>void myPrintf(const char * s){ while (*s) { if (*s == '%') { if (*(s + 1) == '%') { ++s; } else { throw std::runtime_error("invalid format string: missing arguments"); } } std::cout << *s++; }}template<typename T, typename... Args>void myPrintf(const char * s, T value, Args... args){ while (*s) { if (*s == '%') { if (*(s + 1) == '%') { ++s; } else { std::cout << value; myPrintf(s + 1, args...); // 即便 *s == 0 的時候,也調用,以便用於檢測多餘的參數。 return; } } std::cout << *s++; } throw std::logic_error("extra arguments provided to myPrintf");}int main ( ){ // 每一個百分比符號,輸出一個參數 myPrintf( "a%bcde%fghij%kl%mn\n", 12, "interesting", 8421, "very_interesing" ); return EXIT_SUCCESS;}