std::optional

  • Post author:
  • Post category:
  • Post comments:0评论

std::optional是C++17中引入的一个非常有用的类型,用于表示可能包含值或不包含值(即“可选”值)的容器。它提供了一种比使用nullptr或特殊值更安全的方式来处理可能不存在的数据。下面是一个使用std::optional的简单示例:

当一个 optional 类型的对象被按语境转换到 bool 时,若对象含值则转换返回 true,若它不含值则返回 false。

#include <iostream>
#include <optional>

// 模拟创建工厂
std::optional<std::string> create(int type)
{
    switch (type)
    {
    case 1:

        return "class1";
        break;
    case 2:

        return "class2";
        break;
    case 3:

        return "class3";
        break;
    default:
        return {};
        break;
    }
    return {};
}

int main()
{
    auto value = create(3);
    if (value)
    {
        std::cout << "create: " << *value << std::endl;
    }
    else
    {
        std::cout << "not create" << std::endl;
    }

    auto no_value = create(-1);
    if (no_value)
    {
        std::cout << "create: " << no_value.value() << std::endl;
    }
    else
    {
        std::cout << "not create." << std::endl;
    }
    return 0;
}

#include <iostream>
#include <optional>
#include <memory>

class base {
public:
    base(){}
    virtual ~base(){}
    virtual void Show()
    {
        std::cout << "base\n";
    }
};

class A: public base{
public:
    A(){}
    virtual ~A(){}
    virtual void Show()
    {
        std::cout << "A\n";
    }
};

class B : public base {
public:
    B() {}
    virtual ~B() {}

    virtual void Show()
    {
        std::cout << "B\n";
    }
};

// 模拟创建工厂
std::optional<std::shared_ptr<base>> create(int type)
{
    switch (type)
    {
    case 1:
        return std::make_shared<base>();
        break;
    case 2:
        return std::make_shared<A>();
        break;
    case 3:
        return std::make_shared<B>();
        break;
    default:
        return {};
        break;
    }
    return {};
}

int main()
{
    auto value = create(1);
    if (value)
    {
        (*value)->Show();
    }
    else
    {
        std::cout << "not create" << std::endl;
    }
    value = create(2);
    if (value)
    {
        (*value)->Show();
    }
    else
    {
        std::cout << "not create" << std::endl;
    }
    value = create(3);
    if (value)
    {
        (*value)->Show();
    }
    else
    {
        std::cout << "not create" << std::endl;
    }

    auto no_value = create(-1);
    if (no_value)
    {
        std::cout << "create: " << no_value.value() << std::endl;
    }
    else
    {
        std::cout << "not create." << std::endl;
    }
    return 0;
}
文章作者: 张拓
文章链接: http://www.xssl.online/stdoptional/
版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议。转载请注明来自 张拓的博客
浏览次数: 213

张拓

陕西西安蓝田张拓QQ1070410059。一生所求不过“心安”二字。 然,尘世多纷扰。

发表回复