可变参数模板包括可变参数函数模板和可变参数类模板。
可变参数函数模板
可变参数函数模板通常是递归的。第一步调用处理包中的第一个实参,然后用剩余实参调用自身。
在我们的print函数中,每次递归调用将第二个实参打印到第一个实参表示的流中。为了终止递归,我们还需要定义一个非可变参数的print函数,接受一个流和一个对象。
1 | //用来终止递归并打印最后一个元素的函数 |
可变参数类模板
可变参数类模板的展开通常需要定义两到三个类。下面实现C++11标准库简化版本的tuple可变参数类模板:
1 | namespace variadic_template |
如下的继承声明实现了递归继承关系:
1 | template<typename Head, typename... Tail> |
tuple<int, float, std::string> t(41, 1.23, "hello");
声明的整个继承关系如下: