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([] ...
随机推荐
- UVa 548 Tree(二叉树最短路径)
You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...
- 可变数据类型&不可变数据类型
不同的变量在内存中有不同的存储空间,每个存储空间都有一个ID >>> a = 32 >>> id(a) # 查看ID 1571185856 >>> ...
- tar.gz和.rpm包的区别与使用(转)
一.Linux软件的二进制分发 Linux软件的二进制分发是指事先已经编译好二进制形式的软件包的发布形式,其优点是安装使用容易,缺点则是缺乏灵活性,如果该软件包是为特定的硬件/操作系统平台编译的,那它 ...
- Swift 小技巧 || 老偏方
自己平时用的时候,或者看别人有一些好用的技巧分享一下,希望大家能get到 1.关于颜色 2.关于标记 // TODO:这样的标记XCode8才有的 // FIXME:这个也是XCode8有的
- win下svn常用操作笔记
svn基本命令 checkout 检出 把服务器代码下载到本地一份update 更新 把服务器上的最新代码更新到本地commit 提交 把本地代码提交到服务器上 win下svn的客户端工具Tortoi ...
- FTPserver
客户端代码: import os import hashlib BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__) ...
- Json中不支持任何形式的注释,那我们要怎么解决呢
Json中不支持任何形式的注释,我们可以使用曲线救国的思路:在对象的定义中添加一个key(comment),其对应的value值就是注释填写的语句. 如: { "name":&qu ...
- vue2.0后台系统
参考网址: http://www.cnblogs.com/linxin/p/6509897.html
- jquery Jquery 遍历 获取设置 效果
speed: slow fast 毫秒 隐藏 显示 $(selector).hide(speed,callback) 隐藏. $(selector).show(speed,callback) 显示 $ ...
- JavaScript 中 如何判断一个元素是否在一个数组中
<script type="text/javascript"> var arrList=['12','qw','q','v','d','t']; console.log ...