遇见YY

导航

 

template
class oprional;//since C++17
The class template std::optional manages an optional contained value, i.e. a value that may or may not be present.
optional一个常见的用法是作为一个可能失败的函数的返回值。
相比于std::pair<T,bool>,optional可以很好的处理昂贵的构造对象(The expansive-to-construct object),并且可读性也更好。
任何地方任何时候的optional的实例都要么包含一个值要么不包含一个值。
如果的optional的实例包含了一个值,则保证该值是作为optional实例的一部分内存进行分配,既不会动态内存分配。
当optional的实例隐式或者显示转化为一个bool值时,则如果实例包含了一个值转化为true,否则转化为false。
下列情况optional实例包含一个值:

  • 通过一个类型为T的值(a value of type T)或者另一个包含值的optional的实例初始化一个实例对象或者重新赋值。

下列情况optional实例不包含值:

  • 通过默认构造函数生成的实例对象。
  • 实例对象通过std::nullopt或者通过另一个不包含值的optional的实例初始化或者重新赋值。
  • 实例对象调用reset()函数。
#include <functional>
#include <iostream>
#include <optional>
#include <string>
// optional can be used as the return type of a factory that may fail!
std::optional<std::string> create1(bool b) {
    if (b)
        return "Hello";
    return {};
}


auto create2(bool b) {
    return b ? std::optional<std::string>{"Hello"} : std::nullopt;
}

// std::reference_wrapper may be used to return a reference!
auto create_ref(bool b) {
    static std::string value = "Hello";
    return b ? std::optional<std::reference_wrapper<std::string>>{value}
             : std::nullopt;
}

int main()
{
    std::cout << "create(false) returned "<< create1(false).value_or("empty") << '\n';


    if (auto str = create2(true)) {
        std::cout << "create2(true) returned " << *str << '\n';
    }

    if (auto str = create_ref(true)) {
        std::cout << "create_ref(true)  returned " << str->get() << '\n';
        str->get() = "World";
        std::cout << "modifying it changed it to " << str->get() << '\n';
    }
}


参考:https://en.cppreference.com/w/cpp/utility/optional

posted on 2021-01-15 15:08  一骑红尘妃子笑!  阅读(367)  评论(0编辑  收藏  举报