我有一些成员在容器类的构造时无法初始化,因为构造它们的信息不可用。目前我正在使用 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/