从零开始写STL—模板元编程之tuple
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的更多相关文章
- 从零开始写STL—模板元编程之any
any class any; (since C++17) The class any describes a type-safe container for single values of any ...
- 从零开始写STL - 智能指针
从零开始写STL - 智能指针 智能指针的分类及其特点: scoped_ptr:初始化获得资源控制权,在作用域结束释放资源 shared_ptr: 引用计数来控制共享资源,最后一个资源的引用被释放的时 ...
- javascript 元编程之 method_missing
javascript 元编程之 method_missing 引言 要说元编程 ruby 中技巧太多了,今天来写的这个技术也来自于 ruby 中的灵感. method_missing 这个在 ruby ...
- 从零开始写STL—栈和队列
从零开始写STL-栈和队列 适配器模式 意图:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 主要解决:主要解决在软件系统中,常常要将 ...
- 从零开始写STL—functional
function C++11 将任意类型的可调用(Callable)对象与函数调用的特征封装到一起. 这里的类是对函数策略的封装,将函数的性质抽象成组件,便于和algorithm库配合使用 基本运算符 ...
- 从零开始写STL—容器—vector
从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...
- 技术解析丨C++元编程之Parser Combinator
摘要:借助C++的constexpr能力,可以轻而易举的构造Parser Combinator,对用户定义的字符串(User defined literal)释放了巨大的潜力. ## 引子 前不久在C ...
- Javascript元编程之Annotation
语言的自由度 自由度这个概念在不同领域有不同的定义,我们借鉴数学中构成一个空间的维数来表达其自由度的做法,在此指的是:解决同一个问题彼此不相关的设计方法学数量. 例如,解决一个比如商品打折的问题,如何 ...
- 从零开始写STL—哈希表
static const int _stl_num_primes = 28; template<typename T, typename Hash = xhash<T>> cl ...
随机推荐
- jstat查看JVM的GC情况
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上 ...
- ubuntu破解密码方法
摘要: 开机按住任何键(shift)停住grub菜单,进入advanced option for ubuntu,出现的菜单中,光标移动至…(recovery mode)按E进入编辑,找到ro reco ...
- COGS 1743. 忠诚
★ 输入文件:faithful.in 输出文件:faithful.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 老管家是一个聪明能干的人.他为财主工作了整整1 ...
- [Python學習筆記] 使用 selenium 抓取網頁並且雙擊滑鼠 (double click)
一開始使用的時候 看官方文件 以為使用 double_click()即可 但後來出現錯誤 AttributeError: 'WebElement' object has no attribute 'd ...
- TCP socket如何判断连接断开
http://blog.csdn.net/zzhongcy/article/details/21992123 SO_KEEPALIVE是系统底层的机制,用于系统维护每一个tcp连接的. 心跳线程属于应 ...
- Spring AOP源码解析——专治你不会看源码的坏毛病!
昨天有个大牛说我啰嗦,眼光比较细碎,看不到重点.太他爷爷的有道理了!要说看人品,还是女孩子强一些. 原来记得看到一个男孩子的抱怨,说怎么两人刚刚开始在一起,女孩子在心里就已经和他过完了一辈子.哥哥们, ...
- windows安装tensorflow的一个教训
今天没什么课,然后就准备安装tensorflow. 看了一下教程,就去做了. 然后就犯了错误.网上的教程还是有一些差异的,而我又比较大意,没有很注意到CUDA,cudnn的版本要求,也过于高估自己cp ...
- 最小生成树 || HDU 1301 Jungle Roads
裸的最小生成树 输入很蓝瘦 **并查集 int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); } 找到x在并查集里的根结点,如果 ...
- 小程序01 微信小程序介绍和开发准备
前言 火爆的微信小程序:跳一跳.摩拜单车.美柚.大众点评.滴滴出行 背景 为什么会有小程序? 微信最早推出公众号和服务号,公众号和服务号所传播的网页经常出现加载缓慢甚至页面空白的情况. 微信小程序的诞 ...
- pytorch系列 -- 9 pytorch nn.init 中实现的初始化函数 uniform, normal, const, Xavier, He initialization
本文内容:1. Xavier 初始化2. nn.init 中各种初始化函数3. He 初始化 torch.init https://pytorch.org/docs/stable/nn.html#to ...