Boost--optional


#include 
#include 
#include 
#include 
#include 
#include "boost/optional.hpp"
#include "boost/variant.hpp"

using namespace std;

deque queue;

//
//char get_async_data() {
//    if (!queue.empty())
//        return queue.back();
//    else
//        return '\0'; // 空的时候返回什么?返回'\0'是一个非法的字符
//}

//这时候就该optional出马了
boost::optional get_async_data() {
    if (!queue.empty())
        return boost::optional(queue.back());
    else
        return boost::optional(); 
}

int main() {
    // 可以使用:
    boost::variant v;

    // 或者optional:
    boost::optional 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 opA;  // 没有构造
    boost::optional opA(a);    //构造
    cout << opA->name << " " << opA->value << endl;

    // 指针
    boost::optional opAP(&a);
    cout << (*opAP)->name << " " << (*opAP)->value << endl;

    // 引用
    boost::optional opAR(a);
    opAR->name = "Bob";  // 

    // 关系运算符
    boost::optional oInt1(9);
    boost::optional oInt2(1);
    if (oInt1 < oInt2)
        cout << "oInt1 is bigger" << endl;  // 如果两者都初始化了,比较其值
                                                        // 否则,认为未初始化的最小
    
    // optional没有建模为指针!!!
}