【C++2.0新特性】可变模板参数

Posted by LudoArt on September 10, 2019

可变参数模板

可变参数模板可以创建可接受可变数量参数的模板函数和模板类。如以下代码:

/*处理边界情况,即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提供了一个用省略号表示的元运算符,是声明表示模板参数包的标识符,模板参数包基本上是一个类型列表。

TypesT 的区别在于, 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的一个例子

20190910171821.png