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

  1. C++ 中关于optional 使用过程中遇到的问题

    头文件:#include <boost/optional.hpp> using namespace boost; optional很像一个仅能存放一个元素的容器,它实现了"未初始 ...

  2. Boost LRU-Cache使用方法简介

    缓存是提高系统运行效率的常用组件,可以将"有效的"业务数据直接返回用户,避免繁琐的计算过程.除了Redis.MemCache等常用缓存系统,应用程序内部也可以根据需要设置一定容量的 ...

  3. optional的使用

    :first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...

  4. Boost filessystem...

    CMakeList.txt: cmake_minimum_required(VERSION 3.8) project(Demo) ) set(SOURCE_FILES main.cpp) //需要添加 ...

  5. boost-实用工具:noncopyable、optional、assign

    1.noncopyable 让一个类从noncopyable继承可以实现禁止对象的复制,使用需要包含头文件"boost/noncopyable.hpp"或"boost/u ...

  6. c++11实现c++14的optional

    c++14中将包含一个std::optional类,它的功能和用法和boost的optional类似.optional<T>内部存储空间可能存储了T类型的值也可能没有存储T类型的值,只有当 ...

  7. C++17 新特性之 std::optional(上)

    最近在学习 c++ 17 的一些新特性,为了加强记忆和理解,把这些内容作为笔记记录下来,有理解不对的地方请指正,欢迎大家留言交流. 引言 在介绍之前,我们从一个问题出发,C++ 的函数如何返回多个值? ...

  8. boost propertyTree

    Boost PropertyTree provides a tree structure to store key/value pairs. Tree structures means that a ...

  9. 使用Condition Variables 实现一个线程安全队列

    使用Condition Variables实现一个线程安全队列 测试机: i7-4800MQ .7GHz, logical core, physical core, 8G memory, 256GB ...

  10. c++ 数据持久层研究(一)

    C++ORM框架自动生成代码数据库  用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis ...

随机推荐

  1. Excel导入CSV文件中文乱码

    参考: iconv -f UTF8 -t GB18030 a.csv >b.csv 或iconv -f UTF-8 -t GB18030 a.csv >b.csv

  2. 洛谷P2051 中国象棋(dp)

    题目链接:传送门 题目大意: 在N行M列的棋盘中放象棋中的“炮”,问要使得“炮”两两互不伤害,有多少种放法. 1 ≤ n,m ≤ 100,答案对9999973取模. 思路: 按行更新答案.每行炮可以放 ...

  3. Linux压缩文件笔记

    https://my.oschina.net/dongqianlin/blog/97168http://linux.it.net.cn/CentOS/fast/2017/0628/27029.html ...

  4. CentOS7源码安装qbittorrent最新版本

    CentOS的软件 yum 里 yum search qbittorrent yum info qbittorrent 找到的是3.37版本 官网最新的是4.12版本.但需要源码安装: 官网下载最新版 ...

  5. 【Wannafly挑战赛14C可达性】【Tarjan缩点】

    链接:https://www.nowcoder.com/acm/contest/81/C来源:牛客网 题目描述 给出一个 0 ≤ N ≤ 105 点数.0 ≤ M ≤ 105 边数的有向图,输出一个尽 ...

  6. ionic中ng-options与默认选中第一项的问题

    1. select中动态添加数据时发现一个选项为空,在选中了其他选项时,在点击时发现第一个空选项消失了,所有我们需要设置一个默认的选项: 2. 开始的时候我用的方法: <select class ...

  7. 【HAOI2012】容易题

    终于自己做出一道题了quq 原题: 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[ ...

  8. centos7.3使用花生壳映射端口

    首先下载花生壳客户端(其实我觉得更应该叫做服务端),选择相应的版本就可,例如我就是选择的linux->centos版本的 https://hsk.oray.com/download/ 我的版本为 ...

  9. xencenter创建快照和恢复快照

    创建快照 恢复快照

  10. C++问题汇总

    1.C++中类相互调用注意事项 (1)若A类中的方法需要调用B类中的函数,那么A类的源文件(或头文件)中需要包含B类的classs声明头文件.若使用了命名空间,还需要在B类的源文件(或头文件)中使用 ...