c++11 tuple实现
实现一个简易版的c++11 tuple。
我使用的编译器是gcc,codeblocks13.12自带的,哪个版本我不熟gcc也没去查。
大致看了下他家的tuple实现,多继承,tuple之上还有2个辅助类,走的是类似loki中GenScatterHierarchy的路子。1092行代码,不是盖的。。。
有些强迫症,不打算用多继承,,虽然并不会实例化来,看着闹心。
只考虑实现到POD类型的基本支持就行了,什么右值之类的我还没看到,就不搞了,仅供参考。
个人觉得tuple保存POD类型值就足够了,泛滥就堕落了。
单继承版本确实比多继承版本美得多了,可变模板参数真是个好东西。
为了tuple_get只需使用static_cast,tuple是public继承的。当然私有继承更好,只是。。。我想tuple的使用应该没有地方会造成歧义吧。
提供了一个tuuple_get<int>(const tuple&)接口获取指定位置的值。
#ifndef HI_MPL_TUPLE_H_INCLUDE
#define HI_MPL_TUPLE_H_INCLUDE namespace hi {
using namespace mpl::utils;
//////////////////////////////////////////////////////////
template<typename... TList> struct tuple; template<> struct tuple<> {}; typedef tuple<> nulltuple; //////////////////////////////////////////////////////////
template<typename T, typename... TList>
struct tuple<T, TList...> : public tuple<TList...>
{
typedef T value_type;
typedef tuple<TList...> base_type;
typedef tuple<T, TList...> this_type; tuple(const T& v, const TList&... tails):base_type(tails...),_value(v) {} tuple(T&& v, TList&&... tails):base_type(std::move(tails)...), _value(std::forward<T>(v)) {}
tuple(T&& v, TList&... tails):base_type(std::move(tails)...), _value(std::forward<T>(v)) {}
tuple(T& v, TList&&... tails):base_type(std::move(tails)...), _value(std::forward<T>(v)) {} tuple(const this_type& other):base_type(static_cast<const base_type&>(other)),_value(other._value)
{} tuple(this_type&& other):base_type(std::move(static_cast<base_type&>(other))),_value(std::forward<T>(other._value))
{} const T& head() const { return this->_value; }
T& head() { return this->_value; } this_type& operator=(const this_type& other)
{
base_type::operator=(static_cast<const base_type&>(other));
_value = other._value;
return *this;
} this_type& operator=(this_type&& other)
{
base_type::operator=(std::move(static_cast<base_type&>(other)));
_value = other._value;
return *this;
} protected:
T _value;
}; template<typename T>
struct tuple<T> : public nulltuple
{
typedef T value_type;
typedef nulltuple base_type;
typedef tuple<T> this_type; tuple(const T& v):_value(v) {}
tuple(T&& v):_value(std::forward<T>(v)) {} tuple(const this_type& other):_value(other._value) {} tuple(this_type&& other):_value(std::forward<T>(other._value)) {} const T& head() const { return this->_value; }
T& head() { return this->_value; }
this_type& operator=(const this_type& other)
{
_value = other._value;
return *this;
}
this_type& operator=(this_type&& other)
{
_value = other._value;
return *this;
} protected:
T _value;
}; //////////////////////////////////////////////////////////
template<unsigned int N, typename... TList> struct tuple_at; template<unsigned int N, typename T, typename... TList>
struct tuple_at< N, tuple<T, TList...> >
{
typedef typename tuple_at< N-, tuple<TList...> >::value_type value_type;
typedef typename tuple_at< N-, tuple<TList...> >::tuple_type tuple_type;
}; template<typename T, typename... TList>
struct tuple_at< , tuple<T, TList...> >
{
typedef T value_type;
typedef tuple<T, TList...> tuple_type;
}; template<>
struct tuple_at<, nulltuple>
{
typedef nulltuple value_type;
typedef nulltuple tuple_type;
}; //////////////////////////////////////////////////////////
template<unsigned int N, typename... TList>
constexpr const typename tuple_at<N, tuple<TList...> >::value_type&
tuple_get(const tuple<TList...>& tuple_)
{
typedef tuple<TList...> tuple_type;
typedef typename tuple_at<N, tuple_type>::tuple_type base_tuple_type; return static_cast<const base_tuple_type&>(tuple_).head();
} template<unsigned int N, typename... TList>
typename tuple_at<N, tuple<TList...> >::value_type&
tuple_get(tuple<TList...>& tuple_)
{
typedef tuple<TList...> tuple_type;
typedef typename tuple_at<N, tuple_type>::tuple_type base_tuple_type; return static_cast<base_tuple_type&>(tuple_).head();
}
}
#endif
例子:
#include "TypeTuple.h"
#include <tuple> int main()
{
bool b;
tuple<int, float, char> pp = {, 0.1234, 'a'};
b = std::is_same<tuple_at<, tuple<int, float, char>>::value_type, char >::value;
std::cout << "is same: " << b << std::endl;
b = std::is_same<tuple_at<, tuple<int, float, char>>::tuple_type, tuple<char> >::value;
std::cout << "is same: " << b << std::endl;
std::cout << tuple_get<>(pp)<<" "<< tuple_get<>(pp) <<" "<<tuple_get<>(pp) << std::endl;
std::tuple<int, float, char> cc{, 0.1234, 'a'};
std::cout << sizeof(pp) << " " << sizeof(cc) << std::endl;
tuple<int, float, char> ppc = pp;
std::cout << tuple_get<>(ppc)<<" "<< tuple_get<>(ppc) <<" "<<tuple_get<>(ppc) << std::endl;
return ;
}
c++11 tuple实现的更多相关文章
- C++11 tuple元组
C++11 tuple 元组 tuple容器(元组), 是表示元组容器, 是不包含任何结构的,快速而低质(粗制滥造, quick and dirty)的, 可以用于函数返回多个返回值; tuple容器 ...
- C++11 tuple
tuple元组定义了一个有固定数目元素的容器,其中的每个元素类型都可以不相同,这与其他容器有着本质的区别.是对pair的泛化. 首先来介绍元组的创建和元组元素的访问.通过make_tuple()创建元 ...
- c++11——tuple元组
tuple是一个固定大小的不同类型值的集合,是泛化的 std::pair.可以当做一通用的结构体使用,不需要创建结构体而又获取结构体的特征,在某些情况下可以取代结构体,使程序简洁.直观. 创建tupl ...
- c#编程指南(四) 组元(Tuple)
(1).C#语法中一个个问号(?)的运算符是指:可以为 null 的类型. MSDN上面的解释: 在处理数据库和其他包含不可赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型以及日期类型的功 ...
- C++11_ tuple
版权声明:本文为博主原创文章,未经博主允许不得转载. tuple 是一个可以装载任何变量的容器,C++11的Variadic Templates给tuple的实现带来了极大方便. tuple的实现基于 ...
- 【python基础】第11回 数据类型内置方法 02
本章内容概要 列表内置方法 字典内置方法 元组内置方法 集合内置方法 可变类型与不可变类型 本章内容详细 1.列表内置方法 list 列表在调用内置方法之后不会产生新的值 1.1 统计列表中的数据值的 ...
- Learning storm book 笔记8-Log Processing With Storm
有代码的书籍看起来就是爽,看完顺便跑个demo,感觉很爽! 场景分析 主要是利用apache的访问日志来进行分析统计 如用户的IP来源,来自哪个国家或地区,用户使用的Os,浏览器等信息,以及像搜索的热 ...
- C++可变参数模板实现输出
C++11 tuple&可变参数模板 template void Print(T value) { std::cout << value << std::endl; } ...
- 洗礼灵魂,修炼python(18)--温故加知新
类型转换: 1.str(),repr(),format():将非字符串数据转换为字符串 str():对象序列化的结果,相当于print输出 repr():程序中某个对象精确值 format():利用特 ...
随机推荐
- 关于contenteditable属性
今天刷刷看看,看到了发说说框,发现居然不是textarea的,百思不得其解围.后来看到contenteditable,心想应该就是这个搞怪的吧,百度了下.w3c的解释是contenteditable属 ...
- python入门-基础语法
一.变量 定义字符串要加单引号‘’ 变量命名规范: 变量名只能是字母.数字或下划线的任意组合 变量名的第一个字符不能是数字 变量名不能用关键字 变量名不要用中文 变量名不要太长,区分大小写 面就用单引 ...
- xxx征集系统项目目标文档
分组:每四人一组 主题:xxx征集系统 成果: 讨论结束后,每组提交一份课堂讨论记录(电子版发表到博客上,纸质版小组成员签名,下节课提交). 每人根据课堂讨论结果提交一份系统利益相关者描述案例.撰写项 ...
- PI接口开发之调java WS接口
java提供的WSDL:http://XXX.XXX.XXX.XX/XXXXXXXcrm/ws/financialStatementsService?wsdl 登陆PI,下载Enterprise Se ...
- python 爬虫&爬取豆瓣电影top250
爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...
- [hdu P1599] find the mincost route
[hdu P1599] find the mincost route 杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V ...
- 1、安装Angular-CLI脚手架工具
依赖环境的安装 1.安装node.js(版本在6以上) 查看版本号:node -v 2.安装npm(npm会随着node的安装一起被安装) 3.安装Python(我安装的是2.7.14),要安装环境变 ...
- multipath配置详细参考
1.配置文件结构及位置multipath配置文件/etc/multipath.conf由节(section),子节(sub-section),属性(atribute)和属性值(value)等组成,其结 ...
- 移动web技能总结
对于作为一名前端开发人员,除了能够编写出满足需求的PC端页面之外,同时也是需要懂得怎么去制作移动web页面,毕竟使用移动设备来操作任何处理称为新时代的趋势,所以学好制作一个移动web时必须滴.于是通过 ...
- Android7.0手机程序保活(附源码下载)
项目地址,求starhttps://github.com/979451341/AppAlive 本人在学习音视频时无意发现的黑科技,发现在使用AudioTrack播放音乐时,使用手机的一键清理发现程序 ...