boost-数据类型之auto、any、tuple、variant
1、auto、decltype
auto是C++11中的关键字,它可以通过类型推导自动得到变量或对象的类型,需要注意的是auto会忽略引用,因为引用其实就代表原对象:
#include <vector>
#include "boost/assign.hpp"
using namespace boost::assign; int main()
{
auto i = ;
auto f = 12.34;
auto s = string("abc");
cout << i << ", " << f << ", " << s << endl;
int num = i;
double d = f;
string str = s; vector<int> vc = list_of() () ();
auto iter = vc.begin();
auto iterEnd = vc.end();
for (; iter != iterEnd; iter++)
{
cout << *iter << endl;
} return ;
}
auto还可以配合C++11中的“尾置返回”,尾置返回”适用于返回类型比较复杂的函数。如以下func函数的返回类型为指向包含三个int元素的数组的地址:
auto func()->int(*)[]
{
static int ary[];
return &ary;
}
以上代码其实与下面代码效果相同:
typedef int(*pAry)[];
pAry func2()
{
static int ary[];
return &ary;
}
auto还可以用在for循环中使代码简单:
int ary[] = { , , };
for (auto e : ary)
{
std::cout << e << std::endl;
}
int ary[] = { , , };
for (auto& e : ary)
{
e = ;
}
char* ary[] = { "c++", "java", "python" };
for (auto* p : ary)
{
std::cout << p << std::endl;
}
如果我们希望从表达式中推断出要定义变量的类型,但却不想用表达式的值去初始化变量,那么可以使用decltype,需要注意的是如果decltype使用的变量加上一个括号的话那么decltype会返回对应的引用类型:
int func(int i)
{
return i;
}
decltype(func()) num = ; //num是int类型,不会调用func() std::vector<int> vc = { , , , , };
auto size = vc.size();
for (decltype(size) i = ; i < size; i++) // i是size_t类型
{
;
} int i = ;
decltype((i)) d = num; //d是int引用类型,其指向num
2、any
any功能与auto类似,二者不同之处在于:auto是一个类似int、double、string的C++关键字,它不是一个类,所以没有成员函数可调用,直接把他当做int、double、string这种关键字来使用。any是一个类,只能通过any_cast<>获得any的实际内部值,而不能像auto定义的对象那样直接使用它。
any也可以用来存储任意类型元素,如int、double、string、vector或自定义类型。它能够存储任意类型的原因是其构造函数和赋值函数opeartor=是模板函数,可以接收任意类型。any不是一个模板类,所以定义元素的时候不必使用<>,如any a = 10;
需要注意的有两点:
在any存储字符串的时候只能使用string,如any a = string("hello");,不能使用C风格的字符串,如:any a = "hello";
如果保存动态内存指针类型,会引起内存泄露,解决方法是使用智能指针shared_ptr来指向动态内存,如:shared_ptr<char> ptrSmart(new char[10]); any a = ptrSmart;
any的出现让C++仿佛变成了一种弱类型的动态语言。
动态语言:运行期间才做数据类型检查的语言,即编译的时候不知道每一个变量的类型,如php、Ruby
静态语言:编译期间做数据类型检查的语言,即编译的时候就知道每一个变量的类型,如C/C++、C#、JAVA
强类型:变量一定是有类型的, 且变量/对象的类型一旦确定, 其类型不再允许更改,如C/C++/Java/C#
弱类型: 变量的类型概念很弱或者没有类型的概念, 不同变量的类型可以更改. 如php、Ruby
类型安全:的代码不会试图访问自己没被授权的内存区域,如C/C++就不是类型安全的,两个不同类型的指针之间可以通过dynamic_cast进行转换。
any::empty()判断any是否为空
any::type()获得内部对象的类型,是一个标准type_info类的引用
any_cast<>()获得any内部对象值或内部对象指针或内部对象的引用
#include <vector>
#include "boost/any.hpp"
#include "boost/assign.hpp"
using namespace boost::assign; template <typename T>
bool match_type(boost::any& a)
{
if (a.empty())
return false; return typeid(T) == a.type();
} template<typename T>
T get_value(boost::any& a)
{
BOOST_ASSERT(match_type<T>(a)); return boost::any_cast<T>(a);
} template <typename T>
T* get_pointer(boost::any& a)
{
BOOST_ASSERT(match_type<T>(a)); return boost::any_cast<T>(&a);
} template <typename T>
T& get_reference(boost::any& a)
{
BOOST_ASSERT(match_type<T>(a)); return boost::any_cast<T&>(a);
} int main()
{
boost::any a = ; int iNum = get_value<int>(a);//获得a的内部元素
cout << iNum << endl; int * p = get_pointer<int>(a);//获得a内部元素的指针
cout << *p << endl; get_reference<int>(a) = ;//获得a内部元素引用,引用可以被当做左值来使用
cout << *p << endl; if (match_type<int>(a))//判断a内部元素类型是否为int
cout << "true" << endl; return ;
}
3、tuple
tuple类型类似于std::pair,pair只支持包含两种类型的元素,tuple可以支持包含多个不同类型的元素,比如将其用于多个返回值的函数的话比使用struct更方便,一个简单的使用示例如下:
#include <cstdio>
#include <string>
using std::string;
#include "boost/tuple/tuple.hpp" boost::tuple<int, double, string> func()
{
int i = ;
double d = 5.0;
string s("hello");
boost::tuple<int, double, string> tupleCombin(i, d, s); return tupleCombin;
} int main()
{
boost::tuple<int, double, string> tupleCombin = func();
int i = tupleCombin.get<>();
double d = tupleCombin.get<>();
string s = boost::get<>(tupleCombin); return getchar();
}
4、variant
variant是一种增强的union,C/C++中union只能持有POD(普通数据类型),而不能持有如string、vector等复杂类型,boost的variant则没有这个限制。
boost-数据类型之auto、any、tuple、variant的更多相关文章
- 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)
3.5.2 字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就 ...
- Python数据类型list(列表)和tuple(元组)
list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...
- Python数据类型之list和tuple
list是一种有序的集合,可以随时添加和删除其中的元素. 用len()函数可以获得list元素的个数. 用索引来访问list中每一个位置的元素,索引是从0开始的.如果要取最后一个元素,除了计算索引位置 ...
- Python——数据类型之list、tuple
本篇主要内容 • list初识 • list元素的访问 • list内部所有的方法 • tuple介绍和与list用法的比较 我觉得Python里面用的最多的就是List了,感觉好强大.他能存 ...
- Python的数据类型:list和tuple
今天开始认真的学习python. 1.list类型 list是python的一种数据类型,它是一种有序列表,可以随时添加和删除其中的元素. 1.1 list类型的特征 list类型内的成员类型可以相同 ...
- python基础(7):基本数据类型二(list、tuple)、range
1. 列表 1.1 列表的介绍 列表是python的基础数据类型之⼀,其他编程语⾔也有类似的数据类型.比如JS中的数组, java中的数组等等.它是以[ ]括起来,每个元素⽤','隔开⽽且可以存放各种 ...
- 9、Python复杂数据类型(list、tuple、set、dict)
一.列表(list):[a1,a2],可变数据类型 1.序列: 序列是基类类型,序列扩展类型包括:字符串.元组和列表 序列都可以进行的操作包括索引,切片,加,乘,检查成员. 此外,Python已经内置 ...
- python之变量的数据类型(2)list 、 tuple 及range用法
一.变量的数据类型(2) 1.list 类型 列表的特点: 列表是一个可变的数据类型 列表由[]来表示, 每一项元素使用逗号隔开. 列表什么都能装. 能装对象的对象. 列表可以装大量的数据 列表的索引 ...
- 分分钟钟学会Python - 数据类型(list、tuple)
第四节 数据类型(列表.元祖) 今日内容 列表 元祖 1.列表 1.格式 users = ["ji",1,3,"gyhj"] 2.公共方法 1.len #计算长 ...
- 5、python数据类型之元组(tuple)
元组 元组和列表最大的区别是元组中的元素固定,元组不能修改,所以不能对元组进行增.删.改 1.创建 tu = (11,22,33) tu = tuple(11,22,33) tu = tuple([] ...
随机推荐
- Netty编解码技术
编解码技术,说白了就是java序列化技术,序列化目的就两个,第一进行网络传输,第二对象持久化. 虽然我们可以使用java进行对象序列化,netty去传输,但是java序列化的硬伤比较多,比如java序 ...
- js中json知识点
首先,json是一种数据格式,而不能说是一种对象(object).这一点是非常重要的. 起源是不同的语言中数据对象的形式是不一样的,我们为了在不同的语言中传递数据,发明了一种json格式用于消除这种差 ...
- lombok ------让代码更简洁方便
估计在平常写代码中,都会创建entity类的实体来,都是那种创建变量,生成set get 方法,方便外部调用,你以为你很流利的操作快捷键就很方便的了? 其实不然,有一个lombok 工具可以帮我们自动 ...
- Python中list,tuple,dict,set的区别和用法(转)
原文地址:http://www.cnblogs.com/soaringEveryday/p/5044007.html Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个 ...
- [z]eclipase优化
eclipse启动优化,终于不那么卡了! 网上找了好多都是myEclipse的优化的,跟eclipse有点区别,找了很多方法还是不能让这个eclipse(Version: Kepler Release ...
- Logback报错 no applicable action for [Encoding], current ElementPath is [[configuration][appender][Encoding]]
老版本是0.9,移到springboot项目,解决办法,删除xml配置文件节点<Encoding>UTF-8</Encoding>
- mysql导入慢解决方法
[mysqldump]max_allowed_packet = 512M [mysqld] interactive_timeout = 120 innodb_change_buffering=alli ...
- DevExpress中RibbonControl的简单应用
现在介绍一下DevExpress中的RibbonControl的简单应用,搭建一个拥有Office2010风格的窗体程序. 第一步:打开VS2015,新建一个windows窗体应用程序: 第二步:把需 ...
- Spring 监听
Spring 中的事件监听的实现 这里我们不讨论事件监听的机制的原理,我们只讨论如何在项目中实现时间监听. spring的事件监听是基于观察者模式.设计开发中.如下类与接口是我们必须要使用的. App ...
- 迈科DPI和运营商合作比较多
业界领先的DPI/DFI解决方案提供商 专注网络流量数据和应用性能数据的分析优化 业界领先的DPI/DFI解决方案提供商 专注网络流量数据和应用性能数据的分析优化 Previous Next DP ...