• 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 ''; // 空的时候返回什么?返回''是一个非法的字符
    //}
    
    //这时候就该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没有建模为指针!!!
    }
    
  • 相关阅读:
    存储过程拆分字符窜
    jquery学习
    Sql常用语法
    存储过程分页
    asp.net 定时执行程序
    C# 多线程并发处理数据库数据,发送信号等待处理完统一插入.(转)
    (转)CAS 单点登录安装笔记4
    C# 自动退出当前程序,然后再启动
    给自己的Web文件夹增加一个图片或其它文件认证
    Setting NTFS Permissions with C#
  • 原文地址:https://www.cnblogs.com/logchen/p/10225791.html
Copyright © 2020-2023  润新知