我如何获得一个非空的可选值,其中的值是默认构造的?
How do I obtain a non-empty optional with the value inside it being default constructed?
假设我有一个默认构造的空对象 ov
,类型为 std::optional<std::vector<int>>
。
是的,std::vector
可以在没有std::optional
的帮助下表达空的概念,但请耐心等待。
然后让我们说,基于某种逻辑,我决定我必须用一个向量填充它,我想在该向量上一个一个地 push_back
元素。我该怎么办?
在我看来,以下内容有点难看:
ov = decltype(ov)::value_type{};
ov.push_back(/* something */);
ov.push_back(/* something else */);
这真的是解决问题的方法吗?
对于任何可默认构造的类型 T
,您可以通过 std::optional<T>(std::in_place)
使用默认构造的 T
创建一个 optional<T>
。这将执行不带参数的就地构造。
如果您已经有这样一个 optional<T>
实例,您可以简单地对其调用 obj.emplace()
。
最简单的方法是
std::optional<std::vector<int>> ov = {{}};
备选方案包括
std::optional<std::vector<int>> ov(std::in_place);
遗憾的是,没有办法用赋值而不是构造来做到这一点; {{}}
是不明确的,std::in_place
构造函数是显式的。
你必须打电话给 ov.emplace()
。
您可以创建一个辅助对象;
struct non_empty {
template<class T>
constexpr operator std::optional<T>()const{ return {{}}; }
};
然后
ov = non_empty{};
完成任务。
假设我有一个默认构造的空对象 ov
,类型为 std::optional<std::vector<int>>
。
是的,std::vector
可以在没有std::optional
的帮助下表达空的概念,但请耐心等待。
然后让我们说,基于某种逻辑,我决定我必须用一个向量填充它,我想在该向量上一个一个地 push_back
元素。我该怎么办?
在我看来,以下内容有点难看:
ov = decltype(ov)::value_type{};
ov.push_back(/* something */);
ov.push_back(/* something else */);
这真的是解决问题的方法吗?
对于任何可默认构造的类型 T
,您可以通过 std::optional<T>(std::in_place)
使用默认构造的 T
创建一个 optional<T>
。这将执行不带参数的就地构造。
如果您已经有这样一个 optional<T>
实例,您可以简单地对其调用 obj.emplace()
。
最简单的方法是
std::optional<std::vector<int>> ov = {{}};
备选方案包括
std::optional<std::vector<int>> ov(std::in_place);
遗憾的是,没有办法用赋值而不是构造来做到这一点; {{}}
是不明确的,std::in_place
构造函数是显式的。
你必须打电话给 ov.emplace()
。
您可以创建一个辅助对象;
struct non_empty {
template<class T>
constexpr operator std::optional<T>()const{ return {{}}; }
};
然后
ov = non_empty{};
完成任务。