变参模板是C++11中新的特性,它主要解决了原有模板参数数量不可变的问题。现在标准库的tuple实现就是基于变参模板来实现的。
还是从C的变参函数来说吧,经典的就是printf了, 它基于可变参数
void print(const char *fmt, ...) { va_list ls; va_start(fmt, ls); va_arg(ls, int); va_end(ls); }
我们需要知道变参的类型才能够从列表中取出参数,为此之后就有变参宏
#define PRINT(ch, args...) printf(ch, ##args) 或者(C99) #define PRINT(ch, ...) printf(ch, ##__VA_ARGS__ )
后来有了模板,可以接受任意类型,如果想接收多个不同的类型参数就要需要包装器来传递,于是有了pair有了tuple。
template<typename T> void print(T t) { } template<> void print(std::tuple t) { }
这不是理想状态,我们需要接受不定参数的模板的支持,于是乎等的望眼欲穿他终于来了。使用变参模板时,会需要递归来支持,并且需要一个结束函数来处理最后的结果。
template<typename T, typename... L> void print(T t, L... l) { /*可以添加检查 if ( sizeof...(t) < 1) { std::cout << "end" << std::endl; } */ print(t, l); //这里是递归调用 } template<typename T> void print(T t) { std::cout << "end" << std::endl; }...其实也是一个包装器,不过他通过编译器来展开,而不是在运行时来操作,性能自然会好很多。