tuple

Class template std::tuple is a fixed-size collection of heterogeneous values. It is a generalization of std::pair.

可以用来在bind中存储函数指针和参数

实现思路

不定参数模板 + 模板偏特化

tuple作为一个存储不定参数模板的类,分为一下几种偏特化形式:

template<>

struct tuple<> {};

template<typename T, typename... Args>

struct tuple<T, Args...> : public tuple<Args...>

template

struct tuple : public nulltuple

可以注意到每个模板struct tuple<T, Args...> : public tuple<Args...>作为其上一级模板的子类来展开,这样在获取tuple_at时从前向后维护一个当前元素的下标计数来存取元素

源码

template<typename... Args> struct tuple;

	template<>
struct tuple<> {};
typedef tuple<> nulltuple; template<typename T, typename... Args>
struct tuple<T, Args...> : public tuple<Args...>
{
typedef tuple<T, Args...> self_type;
typedef tuple<Args...> base_type;
typedef T value_type;
tuple(const T& v, const Args&... tails) :base_type(tails...), value(v) {}
tuple(T&& v, Args&&... tails) :base_type(std::move(tails)...), value(std::forward<T>(v)) {}
tuple(T&& v, Args&... tails) :base_type(std::move(tails)...), value(std::forward<T>(v)) {}
tuple(T& v, Args&&... tails) :base_type(std::move(tails)...), value(std::forward<T>(v)) {} T& getval()
{
return value;
} T value;
}; template<typename T>
struct tuple<T> : public nulltuple
{
typedef T value_type;
tuple(const T& val) :value(val) {} T& getval()
{
return value;
} T value;
};
template<size_t n, typename T> struct tuple_at; template<size_t n, typename T,typename... Args>
struct tuple_at<n, tuple<T,Args...>>
{
typedef typename tuple_at<n - 1, tuple<Args...>>::value_type value_type;
typedef typename tuple_at<n - 1, tuple<Args...>>::tuple_type tuple_type;
}; template<typename T,typename... Args>
struct tuple_at<0, tuple<T,Args...>>
{
typedef T value_type;
typedef typename tuple<T, Args...> tuple_type;
}; template<typename T>
struct tuple_at<0, tuple<T>>
{
typedef T value_type;
typedef typename tuple<T> tuple_type;
}; template<>
struct tuple_at<0,tuple<>>
{
typedef tuple<> tuple_type;
typedef tuple<> value_type;
}; template<size_t n,typename... Args>
typename tuple_at<n, tuple<Args...>>::value_type& tuple_get(tuple<Args...>& t)
{
typedef typename tuple_at<n, tuple<Args...>>::tuple_type ret_tuple_type;
return static_cast<ret_tuple_type&>(t).getval();
}

从零开始写STL—模板元编程之tuple的更多相关文章

  1. 从零开始写STL—模板元编程之any

    any class any; (since C++17) The class any describes a type-safe container for single values of any ...

  2. 从零开始写STL - 智能指针

    从零开始写STL - 智能指针 智能指针的分类及其特点: scoped_ptr:初始化获得资源控制权,在作用域结束释放资源 shared_ptr: 引用计数来控制共享资源,最后一个资源的引用被释放的时 ...

  3. javascript 元编程之 method_missing

    javascript 元编程之 method_missing 引言 要说元编程 ruby 中技巧太多了,今天来写的这个技术也来自于 ruby 中的灵感. method_missing 这个在 ruby ...

  4. 从零开始写STL—栈和队列

    从零开始写STL-栈和队列 适配器模式 意图:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 主要解决:主要解决在软件系统中,常常要将 ...

  5. 从零开始写STL—functional

    function C++11 将任意类型的可调用(Callable)对象与函数调用的特征封装到一起. 这里的类是对函数策略的封装,将函数的性质抽象成组件,便于和algorithm库配合使用 基本运算符 ...

  6. 从零开始写STL—容器—vector

    从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...

  7. 技术解析丨C++元编程之Parser Combinator

    摘要:借助C++的constexpr能力,可以轻而易举的构造Parser Combinator,对用户定义的字符串(User defined literal)释放了巨大的潜力. ## 引子 前不久在C ...

  8. Javascript元编程之Annotation

    语言的自由度 自由度这个概念在不同领域有不同的定义,我们借鉴数学中构成一个空间的维数来表达其自由度的做法,在此指的是:解决同一个问题彼此不相关的设计方法学数量. 例如,解决一个比如商品打折的问题,如何 ...

  9. 从零开始写STL—哈希表

    static const int _stl_num_primes = 28; template<typename T, typename Hash = xhash<T>> cl ...

随机推荐

  1. Sql Server 2012 分页方法分析(offset and fetch)

    最近在分析 Sql Server 2012 中 offset and fetch 的新特性,发现 offset and fetch 无论语法的简洁还是功能的强大,都是相当相当不错的.其中  offse ...

  2. Android-Emulator使用

    1.查看当前android支持的avd版本 2.创建Emulator avd: android create avd -n magicyu -t 2 -n后面接需要创建avd的名字,-t后面接需要创建 ...

  3. vijos 1772 巧妙填数

    描述 将1,2,\cdots,91,2,⋯,9共99个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:31:2:3的比例. 试求出所有满足条件的三个三位数.例如:三个三位数192,384, ...

  4. 关于Ubuntu上的服务文件

    问题发现 今天在给ubuntu系统安装ftp服务时,一件奇怪的事引起了我的注意.当我服务安装完成后,想要测试一下是否能控制服务,便输入如下命令: service vsftpd restart 它返回的 ...

  5. 2019_京东JAVA实习生招聘机试第一题

    题意抽象出来就是,求根节点的所有子节点中,以这些子节点为根的子树的最大节点数. 已有向图的方式来保存无向图,所以叶子结点i的eage[i].size()==1. import java.util.Ar ...

  6. TensorFlow低阶API(四)—— 图和会话

    简介 TensorFlow使用数据流图将计算表示为独立的指令之间的依赖关系.这可生成低级别的编程模型,在该模型中,您首先定义数据流图,然后创建TensorFlow会话,以便在一组本地和远程设备上运行图 ...

  7. Zend studio 修改编码格式

    一.临时修改编码格式 edit -> Set Encoding... -> Other(选择) 二.修改软件默认编码格式

  8. vue 数据没有驱动视图?

    Part.1  问题 数据改变,视图却没有根据数据而改变. 原因在于,数据并不在 vue 监听范围之内,vue 只对事先在 data 中声明的变量丶对象等类型数据进行监听 Part.2  例子 < ...

  9. 通过 getResources 找不到jar包中的资源和目录的解决方法

    http://my.oschina.net/sub/blog/184074 今天碰到一个怪问题: 原本跑的好好的代码,打成 jar 包就不能运行了. 问题出在,代码中有一段自动扫描 classpath ...

  10. zay大爷的膜你题 D2T1 江城唱晚

    依旧是外链... 这一次网易云爆炸了....所以我决定后面的都用QQ 下面是题面 这道题是一道傻逼题 数学题,我们仔细看一看,首先有m朵花的话,我们就有m!种排列方式(也就是m的全排列), 然后我们假 ...