• C++17 std::optional


    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") << '
    ';
    
    
        if (auto str = create2(true)) {
            std::cout << "create2(true) returned " << *str << '
    ';
        }
    
        if (auto str = create_ref(true)) {
            std::cout << "create_ref(true)  returned " << str->get() << '
    ';
            str->get() = "World";
            std::cout << "modifying it changed it to " << str->get() << '
    ';
        }
    }
    
    
    

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

  • 相关阅读:
    第二阶段冲刺——个人总结05
    购书最低价
    第二阶段冲刺——个人总结04
    第二阶段冲刺——个人总结03
    第二阶段冲刺——个人总结02
    学习进度条——十三周
    第二阶段冲刺——个人总结01
    android模拟器
    unigui导出TMS.Flexcel【5】
    unigui+fastreport 打印【4】
  • 原文地址:https://www.cnblogs.com/iuyy/p/14282183.html
Copyright © 2020-2023  润新知