可变参数模板
可变参数模板可以创建可接受可变数量参数的模板函数和模板类。如以下代码:
/*处理边界情况,即0个参数的情况*/
void print() { }
/*print函数接收一个参数firstArg和一包参数args*/
template <typename T, typename... Types>
void print(const T& firstArg, const Types&... args)
{
/*输出第一个参数*/
cout << firstArg << endl;
/*为剩余的参数调用print()函数*/
print(args...);
}
/*该写法与上面的写法并不会产生冲突*/
template <typename... Types>
void print(const Types&... args)
{ /*...*/ }
C++2.0提供了一个用省略号表示的元运算符,是声明表示模板参数包的标识符,模板参数包基本上是一个类型列表。
Types
和 T
的区别在于, T
与一种类型匹配,而 Types
与任意数量(包括0)的类型匹配。
可将省略号放在函数参数包名的右边,将参数包展开,如 print(args...);
tuple的实现使用了可变参数模板
template<typename... Values> class tuple;
template<> class tuple<> { };
template<typename Head, typename... Tail>
class tuple<Head, Tail...>: private tuple<Tail...>
{
typedef tuple<Tail...> inherited;
public:
tuple() { }
/*inherited(vtail...)是调用base ctor并于参数,不是创建temp object*/
tuple(Head v, Tail... vtail): m_head(v), inherited(vtail...) { }
typename Head::type head() { return m_head; }
inherited& tail() { return *this; }
protected:
Head m_head;
}
tuple的一个例子