#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. 怎样用CMD命令强行删除文件?

    如果你要删除的整个文件夹以及文件夹里面的所有内容的话rd/s/q 盘符:\某个文件夹   (这样整个文件夹所有的文件和文件夹都删除了)比如我想删除D盘的123文件夹以及123文件夹里面所有的内容rd/ ...

  2. scripy

    性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): ...

  3. 欧拉函数  已经优化到o(n)

    欧拉函数 ψ(x)=x*(1-1/pi)  pi为x的质数因子 特殊性质(图片内容就是图片后面的文字) 欧拉函数是积性函数——若m,n互质, ψ(m*n)=ψ(m)*ψ(n): 当n为奇数时,   ψ ...

  4. 【spring源码分析】spring关于循环依赖的问题

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...

  5. 【java多线程】线程状态分析

    一.java线程的状态 NEW: 新建状态,线程对象已经创建,但尚未启动 RUNNABLE:就绪状态,可运行状态,调用了线程的start方法,已经在java虚拟机中执行,等待获取操作系统资源如CPU, ...

  6. golang xml parent node add attribute without struct

    question: golang  encoding/xml: foo>bar,attr - foo ignored solution: you can replace output resul ...

  7. idea新建工程项目结构

    一:新建项目 File--->new---->project--->Empt Project(空项目)--->next--->java_web--->Finish ...

  8. vm centos7中用NAT模式配置上网

    第一步:设置虚拟机的NAT相关网络设置:   点击5标致处的“NAT设置”会出现设置6标致处的网关.   第二部:设置操作系统网络设置,右击上图中9标致处的系统,点击设置   第三部:配置操作系统ip ...

  9. Monte Carlo tree search 学习

    https://en.wikipedia.org/wiki/Monte_Carlo_tree_search 蒙特卡洛树搜索(MCTS)基础 http://mcts.ai/about/index.htm ...

  10. Quart.net配置oracle的坑

    引用的Oracle.DataAccess.dll是64位, 生成选项需要去除默认勾选的 “首选32位”,不然会导致未能加载程序集