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 ...
随机推荐
- Linux矫正时间
ntpdate -u ntp.api.bz 可以写到定时任务里,每天矫正一次
- Linux命令学习之路——文档权限管理:chmod
使用权限:所有角色 使用方式:chmod [ -cfvR ] [ --help ] [ --version ] mode file... 作用:该命令用于在Linux中管理和变更角色对文档的存取权限 ...
- [LeetCode&Python] Problem 371. Sum of Two Integers
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Exam ...
- Gym .101933 Nordic Collegiate Programming Contest (NCPC 2018) (寒假gym自训第四场)
(本套题算是比较温和吧,就是罚时有点高. B .Baby Bites 题意:给出一个婴儿给出的数组,有一些数字听不清楚,让你还原,问它是否是一个从1开始的一次增加的数组. 思路:从左往右依次固定,看是 ...
- 实验吧—密码学——WP之 古典密码
首先我们研究题目 1.古典密码 2.key值的固定结构 3.加密方式就在谜面里 首先看到这些数字我们就能想到ASCII,而且做题多了就能看出123是{:125是},所以得到字符串如下 OCU{CFTE ...
- 【HDOJ2586】【Tarjan离线求LCA】
http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) ...
- crash - JNI WARNING: input is not valid modified utf-8: illegal continuation byte
the key point is "Modified UTF-8" is not like "Regular UTF-8", a legal Rgular UT ...
- <--------------------------Java接口如何使用------------------------------>
关键词:interface --->接口 implements--->实现 1接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应 ...
- Visual Studio项目的生成事件代码
我们打开vs的项目属性可以看到有生成事件,如下图: 可以看到有两块空白区域,这个空白区域可以让我们写代码或脚本来处理编译生成前后的时候,处理一些事情,今天就简单的来说说这两块. 生成前事件命令行 我想 ...
- What happens to our code? JavaScript 代码是怎样执行的
1. 我们的代码第一步会被parser 语法分析程序分析. 如果没有报错之后 2. 生产SyntaxTree, 我们的代码会转换成machine code 3. 最终 我们的代码会被运行出来. 下面的 ...