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; }