c++11 变长模板

关于变长模版这里不记录理论部分了,简单分析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新特性解析与应用》

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容