【问题标题】:How to upcast an static std::optional如何向上转换静态 std::optional
【发布时间】:2021-01-18 00:30:42
【问题描述】:
class Child: public Base {.....}

class Child
{
    static std::optional<Base>& Child::GetBaseInstance()
    {
        static std::optional<Base> instance = std::make_optional<Chid>; \\Does not work. Please help
        return instance;
    }
}

我正在尝试返回一个实例,但它的基础类型为 std::optional。如果我试图传递相同的引用,我还应该返回 std::optional& 或 std::optional 吗?

【问题讨论】:

  • 请考虑 std::optional 专门用于您希望避免动态分配包含的对象的情况。如果这不是问题,可以使用智能指针

标签: c++ c++17 upcasting stdoptional


【解决方案1】:

您不能使用std::optional 作为参考。相反,可以使用原始指针、std::reference_wrapperboost::optional(适用于引用)。

话虽如此,您的 sn-p 中还有另一个缺陷:std::optional&lt;Base&gt; 在从 Child 实例构造时遭受对象切片。你可以阅读更多关于here的信息。

请注意,您还可以使用std::unique_ptrstd::shared_ptr 的类似nullptr 的状态来指示对象的附加布尔属性。在处理类层次结构时,使用这些智能指针通常是有意义的,而std::optional 非常适合值类型对象。

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多