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的更多相关文章

  1. 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)

    3.5.2  字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就 ...

  2. Python数据类型list(列表)和tuple(元组)

    list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...

  3. Python数据类型之list和tuple

    list是一种有序的集合,可以随时添加和删除其中的元素. 用len()函数可以获得list元素的个数. 用索引来访问list中每一个位置的元素,索引是从0开始的.如果要取最后一个元素,除了计算索引位置 ...

  4. Python——数据类型之list、tuple

    本篇主要内容 •  list初识 •  list元素的访问 •  list内部所有的方法 •  tuple介绍和与list用法的比较 我觉得Python里面用的最多的就是List了,感觉好强大.他能存 ...

  5. Python的数据类型:list和tuple

    今天开始认真的学习python. 1.list类型 list是python的一种数据类型,它是一种有序列表,可以随时添加和删除其中的元素. 1.1 list类型的特征 list类型内的成员类型可以相同 ...

  6. python基础(7):基本数据类型二(list、tuple)、range

    1. 列表 1.1 列表的介绍 列表是python的基础数据类型之⼀,其他编程语⾔也有类似的数据类型.比如JS中的数组, java中的数组等等.它是以[ ]括起来,每个元素⽤','隔开⽽且可以存放各种 ...

  7. 9、Python复杂数据类型(list、tuple、set、dict)

    一.列表(list):[a1,a2],可变数据类型 1.序列: 序列是基类类型,序列扩展类型包括:字符串.元组和列表 序列都可以进行的操作包括索引,切片,加,乘,检查成员. 此外,Python已经内置 ...

  8. python之变量的数据类型(2)list 、 tuple 及range用法

    一.变量的数据类型(2) 1.list 类型 列表的特点: 列表是一个可变的数据类型 列表由[]来表示, 每一项元素使用逗号隔开. 列表什么都能装. 能装对象的对象. 列表可以装大量的数据 列表的索引 ...

  9. 分分钟钟学会Python - 数据类型(list、tuple)

    第四节 数据类型(列表.元祖) 今日内容 列表 元祖 1.列表 1.格式 users = ["ji",1,3,"gyhj"] 2.公共方法 1.len #计算长 ...

  10. 5、python数据类型之元组(tuple)

    元组 元组和列表最大的区别是元组中的元素固定,元组不能修改,所以不能对元组进行增.删.改 1.创建 tu = (11,22,33) tu = tuple(11,22,33) tu = tuple([] ...

随机推荐

  1. ECMAScript6的原型

    class Car { constructor(name){ this.name = name; } getName(){ } } class Ferrari extends Car{ constru ...

  2. RocketMQ-quickstart(批量消费)

    一.专业术语 Producer 消费生产者,负责产生消息,一般由业务系统负责产生消息 Consumer 消息消费者,负责消费消息,一般是后台系统负责异步消费 Push Consumer Consume ...

  3. linux下Redis主从复制

    Redis的主从配置比起MySQL主从配置简单多了,而且Redis主从复制中一个主服务可以有多个从服务,一个从服务又可以有多个从服务. MySQL主从配置http://www.cnblogs.com/ ...

  4. php5.6 版本出现 Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version 的错误

    解决方法是修改php.ini配置: ;always_populate_raw_post_data = -1 把前面的分号去掉 always_populate_raw_post_data = -1 然后 ...

  5. php 通过stomp协议连接ActiveMQ

    一.安装php的stomp扩展 http://pecl.php.net/package/stomp 如:stomp-2.0.0.tgz > tar xf stomp-1.0.9.tgz > ...

  6. 基于RBAC权限验证, 中间价middleware实现, views 登录视图代码

    废话不多说  上代码: 基础实现: rom django.shortcuts import HttpResponse, redirect, render from django.http import ...

  7. overflow 在float浮动标签里的作用

    overflow可以使浮动元素回归文档流,但是浮动元素却仍然具有浮动的属性 <!DOCTYPE html> <html lang="en"> <hea ...

  8. Java图形化界面设计——GridBagConstraints

    JAVA布局模式:GridBagConstraints终极技巧参数详解 布局模式 :GridBagConstraints布局,先发一个实例: gridx = 2; // X2 gridy = 0; / ...

  9. JS 实现 jQuery的$(function(){});

    1.浏览器渲染引擎的HTML解析流程 何谓“渲染”,其实就是浏览器把请求到的HTML内容显示出来的过程.渲染引擎首先通过网络获得所请求文档的内容,通常以8K分块的方式完成.下面是渲染引擎在取得内容之后 ...

  10. 虚拟机安装centos7, 再安装gitlab 简单步骤

    先安装Linux centos7(朋友贡献的. Linux官网有下) 我自己用vm安装的. 未出现特殊状况 gitlab的搭建 安装基础包 yum -y install curl policycore ...