从零开始写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 ...
随机推荐
- C# string日期格式
百分数格式应该用“p”这个参数. 格式 原始 数据 结 果 "{0:P}" 0.40 40% 数字 {0:N2} 12.36 数字 {0:N0} 13 货币 {0:c2} $1 ...
- 备忘录:python 3在class中使用yield
之前代码都是直接在函数级别使用yield,但封装class后如何使用yield很少遇到. 经过半天的学习,总算完成示例.代码没有什么特殊地方,仅仅作为一个工作项. 与生成器合作: ########## ...
- Architecture:架构 元素与关系
http://www.iso-architecture.org/42010/cm/ Systems have architectures. In the Standard, the architect ...
- Python基础4 迭代器,生成器,装饰器,Json和pickle 数据序列化
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
- MFC (Combo-box control)下拉列表控件的使用
1.可以选择,但无法编辑状态: 选择下拉框的属性中的类型(Type)参数——Drop List; 2.如何控制Combo Box的下拉长度 1,一.在资源文件中打开对话框,选中Combo Box控件, ...
- Error:Failed to resolve: com.afollestad:material-dialogs:
http://www.chenruixuan.com/archives/1068.html 背景: 同事把Android项目直接考给了我...我在Android Studio上运行,然后提示: Err ...
- Caused by: java.lang.IllegalArgumentException: Parameter Maps collection does not contain value for com.bj186.crm.mapper.UserMapper.Integer
在使用SSM整合myBatis的过程中遇到了这个问题. 问题的原因: 把parameterType错误的写成了parameterMap 解决办法: 将parameterMap修改为parameterT ...
- install docker-ce for ubuntu
may need login vpn first docker-ce for ubuntu chinese version docker-ce for ubuntu
- JS常用字符串处理方法应用总结
这篇文章主要总结了JS常用字符串的处理方法,需要的朋友可以参考下 1.indexOf()方法,从前往后查找字符串位置,大小写敏感,从0开始计数.同理,lastIndexOf() 方法从后往前,两个 ...
- C++ new delete(一)
在C#.Java這種managed語言,因為有garbage collection,所以完全不用考慮free()或delete,但在C/C++,有時候要delete的,有時又不用,到底哪些改delet ...