Boost--optional
#include <vector>
#include <deque>
#include <iostream>
#include <array>
#include <string>
#include "boost/optional.hpp"
#include "boost/variant.hpp"
using namespace std;
deque<char> queue;
//
//char get_async_data() {
// if (!queue.empty())
// return queue.back();
// else
// return '\0'; // 空的时候返回什么?返回'\0'是一个非法的字符
//}
//这时候就该optional出马了
boost::optional<char> get_async_data() {
if (!queue.empty())
return boost::optional<char>(queue.back());
else
return boost::optional<char>();
}
int main() {
// 可以使用:
boost::variant<nullptr_t, char> v;
// 或者optional:
boost::optional<char> op; // op没有进行初始化,没有char被构造
//op.get(); // 断言失败
op = 'A';
op = get_async_data();
if (!op) // 同: if (op != 0),判断是否初始化
cout << "op is not initialized" << endl;
else {
cout << "op contains " << op.get() << endl; // get()要求op已经初始化,否则会崩(断言失败)
cout << "op contains " << *op << endl; // 跟get()一样
}
// 如果不想要if/else的判断
op.reset(); // 将op重置为未初始化状态
cout << op.get_value_or('z') << endl; // 如果op未初始返回'z',否则返回*op
// 或者
char* p = op.get_ptr(); // 返回保存值的一个指针,如果未初始化返回空指针
// optional可以储存任何类型的数据
struct A {string name; int value;};
A a;
boost::optional<A> opA; // 没有构造
boost::optional<A> opA(a); //构造
cout << opA->name << " " << opA->value << endl;
// 指针
boost::optional<A*> opAP(&a);
cout << (*opAP)->name << " " << (*opAP)->value << endl;
// 引用
boost::optional<A&> opAR(a);
opAR->name = "Bob"; //
// 关系运算符
boost::optional<int> oInt1(9);
boost::optional<int> oInt2(1);
if (oInt1 < oInt2)
cout << "oInt1 is bigger" << endl; // 如果两者都初始化了,比较其值
// 否则,认为未初始化的最小
// optional没有建模为指针!!!
}
Boost--optional的更多相关文章
- C++ 中关于optional 使用过程中遇到的问题
头文件:#include <boost/optional.hpp> using namespace boost; optional很像一个仅能存放一个元素的容器,它实现了"未初始 ...
- Boost LRU-Cache使用方法简介
缓存是提高系统运行效率的常用组件,可以将"有效的"业务数据直接返回用户,避免繁琐的计算过程.除了Redis.MemCache等常用缓存系统,应用程序内部也可以根据需要设置一定容量的 ...
- optional的使用
:first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...
- Boost filessystem...
CMakeList.txt: cmake_minimum_required(VERSION 3.8) project(Demo) ) set(SOURCE_FILES main.cpp) //需要添加 ...
- boost-实用工具:noncopyable、optional、assign
1.noncopyable 让一个类从noncopyable继承可以实现禁止对象的复制,使用需要包含头文件"boost/noncopyable.hpp"或"boost/u ...
- c++11实现c++14的optional
c++14中将包含一个std::optional类,它的功能和用法和boost的optional类似.optional<T>内部存储空间可能存储了T类型的值也可能没有存储T类型的值,只有当 ...
- C++17 新特性之 std::optional(上)
最近在学习 c++ 17 的一些新特性,为了加强记忆和理解,把这些内容作为笔记记录下来,有理解不对的地方请指正,欢迎大家留言交流. 引言 在介绍之前,我们从一个问题出发,C++ 的函数如何返回多个值? ...
- boost propertyTree
Boost PropertyTree provides a tree structure to store key/value pairs. Tree structures means that a ...
- 使用Condition Variables 实现一个线程安全队列
使用Condition Variables实现一个线程安全队列 测试机: i7-4800MQ .7GHz, logical core, physical core, 8G memory, 256GB ...
- c++ 数据持久层研究(一)
C++ORM框架自动生成代码数据库 用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis ...
随机推荐
- [LeetCode&Python] Problem 860. Lemonade Change
At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you, and ...
- 解决cocos2dx调用removeFromParent后报错问题
原因:cocos2dx的bug 解决办法: 放到action中,前面添加一个DelayTime延迟,代码如下 this->runAction(Sequence::create(DelayTime ...
- CodeForces - 710F:String Set Queries (二进制分组 处理 在线AC自动机)
ou should process m queries over a set D of strings. Each query is one of three kinds: Add a string ...
- Linux下mysql出错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
安装: 1.新开的云服务器,需要检测系统是否自带安装mysql # yum list installed | grep mysql 2.如果发现有系统自带mysql,果断这么干 # yum -y re ...
- 深入学习Motan系列(二)——服务发布
闯关经验: 袋鼠走过了第一关,顺利搭建出了Demo,信心爆棚.不过之后,心想怎么去研究这个框架呢.查了一下,官方文档,好像没什么东西可以研究啊.后来,又搜了搜博客,因为这是微博的框架嘛,所以搜索时用百 ...
- maven项目eclipse目录结构浅析
maven项目eclipse目录结构浅析 PS:Java Resources是为了方便我们编译,到最后都会编译到 WEB-INF/classes Maven项目的目录结构
- malloc,calloc,alloca和free函数
void *malloc(size_t size)因为返回类型为空,所以可以赋值到任何类型指针,其分配的空间大小为size,返回新分配内存地址的起始处的指针,其所分配的内存未经初始化,若分配失败返回N ...
- Visual Studio不显示智能提示代码,快捷键Alt+→也不出现
最近安装了Dev Express的控件,我的vs2017 Enterprise版的环境,智能提示补全代码的快捷键功能,好像被修改了,不能使用了. 我原来的时候,比如在代码中输入如下代码: Consol ...
- 初始Openwrt
系统结构 在上一章我们已经完成了刷机工作,这个时候系统进行了首次启动,并且格式化了它的"可写"分区.那么在设备里分区到底是怎么样进行的呢?我们首先需要知道:不同的处理器下OpenW ...
- Grid Virtual Server 和 网格计算
Grid Virtual Server 的 Virtual Server 源于 LVS (Linux Virtual Server) , LVS 的意思就是把 多个 Linux 服务器 联合起来构成一 ...