zoukankan      html  css  js  c++  java
  • 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没有建模为指针!!!
    }
    
  • 相关阅读:
    C#控制键盘大小写切换
    C#表示空字符
    正则表达式30分钟入门教程[转自deerchao]
    学习deercao的正则笔记
    c# winform 全角自动转化半角问题(C#中ImeMode的值)
    C# 键盘中的按键对应的KeyValue
    这个Replace可以忽略大小写
    Keys枚举
    反射总结
    C# 中 KeyPress 、KeyDown 和KeyPress的详细区别[转]
  • 原文地址:https://www.cnblogs.com/logchen/p/10225791.html
Copyright © 2011-2022 走看看