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([] ...
随机推荐
- html5文件读取+按钮样式重置+文件内容预览
FileReader读取文件详细介绍请访问:http://www.cnblogs.com/xyyt/p/9066882.html FileReader提供了如下方法: readAsArrayBuffe ...
- TZOJ 3481 Highway Construction(树的直径+最短路)
描述 As head of the Accessible Commuting Movement (ACM), you've been lobbying the mayor to build a new ...
- 【校招面试 之 C/C++】第32题 C++ 11新特性(三)之for关键字
1.for循环的一般写法: int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i = 0; i < 10; i++) cout ...
- css定位研究
css的定位是很重要的一个知识点,要学会网页布局,一定要先把定位弄清楚,今天抽空整理一下这方面的知识. 1.块级元素和行内元素(内联元素) 块级元素:display值为block的元素就是块级元素,比 ...
- day 12 内置函数,装饰器,递归函数
内置函数 内置函数:python给咱们提供了一些他认为你会经常用到的函数,68种 内置函数 abs() dict() help() min() setattr() all() di ...
- java_13.1 javaAPI
1 API概念 API:是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节.2 String类的概念和不变性 Stri ...
- mysql5.5以上my.ini中设置字符集
在mysql5.1之前数据库设置字符集: [mysqld] default-character-set = utf8 mysql5.5以后[mysqld]中就不能使用default-character ...
- power designer 从sqlserver数据库获取字段说明&导出rtf文档模板
具体的操作稍后在修改 附件下载:https://files.cnblogs.com/files/zinan/powerDesigner.rar
- web服务器 双网卡 路由 设置
最近在装服务器的时候,遇到一个问题,就是这个服务器本身是一个web服务器,但它上面装有一个局域网数据交换软件,还需要访局域网. 但软件装上去了,局域网怎么也不能访问,后来了解到是因为双网卡的原因,需要 ...
- PAT 1067 试密码(20)(代码)
1067 试密码(20 分) 当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度 ...