用于保存无法在构造函数中初始化的成员的 C++ 类型

标签 c++

我有一些成员在容器类的构造时无法初始化,因为构造它们的信息不可用。目前我正在使用 std::unique_ptr 在信息可用时构建它们。

动态分配/间接是不必要的开销,因为我知道它们最终会被构建。我可以使用 std::optional,但我觉得 std::optional 的语义会使阅读代码的人认为成员在某种程度上是可选的,它们可能会丢失事实并非如此。

是否有任何 std 库类型可以保存一种类型以供以后构造,其语义比 std::optional 更好?

编辑:示例代码

struct Inner
{
    Inner(int someValue)
        : internalValue(someValue)
    {}

    int internalValue;
};

struct Outer
{
    Outer(){/*...*/}

    void createInner(int someValue)
    {
        assert(inner == nullptr);
        inner = std::make_unique<Inner>(someValue);
    }

    // I would like to avoid the dynamic memory allocation here
    std::unique_ptr<Inner> inner;
};

最佳答案

std:::optional是您要查找的内容,例如:

#include <optional>

struct Inner
{
    Inner(int someValue)
        : internalValue(someValue)
    {}

    int internalValue;
};

struct Outer
{
    Outer(){/*...*/}

    void createInner(int someValue)
    {
        inner = Inner(someValue);
    }

    std::optional<Inner> inner;
};

如果你不喜欢 optional 在你的代码中的样子,你可以简单地定义一个别名来给它一个更适合你情况的名字,例如:

#include <optional>

struct Inner
{
    Inner(int someValue)
        : internalValue(someValue)
    {}

    int internalValue;
};

template<typename T>
using delayed_create = std::optional<T>;

struct Outer
{
    Outer(){/*...*/}

    void createInner(int someValue)
    {
        inner = Inner(someValue);
    }

    delayed_create<Inner> inner;
};

关于用于保存无法在构造函数中初始化的成员的 C++ 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70613489/

相关文章:

c# - 如何找出最快的算法

c++ - 如何打印QImage的所有原始数据在内存中进行比较?

c++ - 复合赋值中关于 `const` 的困惑

C++ 从数组中取出前 n 个元素

c++ - 如何使用 <random> 填充 std::array

c++ - 在 OO 中创建一个窗口

c++ - 二进制文件解释

c++ - move 构造函数(错误 : call to implicitly-deleted copy constructor)

c++ - 避免在 C++ 中的 vector 中进行多次复制

c++ - 设置标准流使用的内部缓冲区 (pubsetbuf)