关于变长模版这里不记录理论部分了,简单分析tuple关于变长模版使用的内容。
tuple的三种定义
这里都忽略了tuple的具体内容,只关注变长模版的一种是使用分析。
主要定义部分
/// Primary class template, tuple
template<typename... _Elements>
class tuple : public _Tuple_impl<0, _Elements...>
{
...
无元素部分
// Explicit specialization, zero-element tuple.
template<>
class tuple<>
{
...
两个元素的定义
template<typename _T1, typename _T2>
class tuple<_T1, _T2> : public _Tuple_impl<0, _T1, _T2>
{
这里只有0个元素的定义和两个元素、多个元素的定义,没有一个元素的定义,猜测是应该没有人一个元素很少用tuple吧,当然非要使用也可以,主要定义部分可以包含这样的内容。
定义0个和两个的模版可以更快速的编译模版减少推导过程。
_Tuple_impl
_Tuple_impl实现了真正的变长模版推导过程。
只有1个元素或一个以上的时候才会调用到这里的内容。
如果元素个数为1直接到定义(3),如果多于1个是直接到(2)。
声明(1)
这是一个声明,不是实现。
template<std::size_t _Idx, typename... _Elements>
struct _Tuple_impl;
两个或以上元素定义(2)
两个元素实现
template<std::size_t _Idx, typename _Head, typename... _Tail>
struct _Tuple_impl<_Idx, _Head, _Tail...>
: public _Tuple_impl < _Idx + 1, _Tail... >,
private _Head_base<_Idx, _Head>
一个元素定义(3)
一个元素实现
// Basis case of inheritance recursion.
template<std::size_t _Idx, typename _Head>
struct _Tuple_impl<_Idx, _Head>
: private _Head_base<_Idx, _Head>
参考:
stl tuple源码
《深入理解C++11:C++11新特性解析与应用》