返回类型为 std::optional<std::variant<...>>

21
我有一个情况,需要一个函数返回从表格中获取的值。假设这个表格运行正常的话,其中一个单元格可能包含一个值,也可能没有。这个值也可以是以下几种类型之一:int, double, string, date(但没有其他类型)。
那么这样的函数应该返回什么呢?使用 std::optional<std::variant<std::string, int, double, std::chrono::time_point>> 这个选项类型和变体类型是否是一个好主意?
这样做是使用 optionalvariant 的一个好方法吗?

听起来可选项和变体可以解决这个需求。 - Kobi
2个回答

33

我认为这是使用std::monostate的有用方式。具体来说,是variant<std::monostate, int, double, std::string, std::chrono::time_point>monostatevariant可能不包含值的情况下非常有用。

optional<variant>相比,使用实际类型的好处在于 visitation(访问)可以正常工作。您可以编写一个接受monostate参数的函数对象,因此即使是“空”变量,也可以使用visit


4
这句话的意思是:"该单元类型旨在作为std::variant中表现良好的空替代品使用。[...]". 翻译时不可改变原意,但需要使内容更易于理解,不能添加解释或返回额外内容。参考链接为:http://en.cppreference.com/w/cpp/utility/variant/monostate - user2296177
2
optional<variant<...>> 如果为空,则为false,如果有值则为true,这非常方便。 - asynth

4

我想补充一点,在C++17之前和标准化variantmonostate之前,已经有boost::blank来解决boost::variant的完全相同的问题。

按照惯例,如果使用boost::blank,它应该始终是第一个模板参数,这样默认构造的变体就是空的,并且检查是否为空是通过.which() == 0进行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接