返回类型std :: optional <std :: variant <...>&gt;

时间:2017-05-18 16:13:30

标签: c++ optional c++17 variant

我的情况是函数必须返回从表中获取的值。此表中的单元格(让我们假设该表正常工作......)可能包含值,或者可能不包含值。此值也可以是以下几种类型之一:int, double, string, date(但没有其他类型)。

这样的功能会返回什么?返回std::optional<std::variant<std::string, int, double, std::chrono::time_point>>

是一个好主意

这会很好地利用optionalvariant吗?

2 个答案:

答案 0 :(得分:15)

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

使用实际类型而不是optional<variant>的好处是访问通常在它上面工作。您可以编写一个可以使用monostate参数的仿函数,从而允许您使用visit进行偶数&#34;清空&#34;变体。

答案 1 :(得分:2)

只需添加一下,在C ++ 17以及variantmonostate的标准化之前,已经有了boost::blank来解决boost::variant的完全相同的问题。

按照惯例,如果使用boost::blank,则应始终将其作为第一个模板参数,以便默认构造的变量为空,并使用.which() == 0检查是否为空。