我的情况是函数必须返回从表中获取的值。此表中的单元格(让我们假设该表正常工作......)可能包含值,或者可能不包含值。此值也可以是以下几种类型之一:int, double, string, date
(但没有其他类型)。
这样的功能会返回什么?返回std::optional<std::variant<std::string, int, double, std::chrono::time_point>>
?
这会很好地利用optional
和variant
吗?
答案 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以及variant
和monostate
的标准化之前,已经有了boost::blank
来解决boost::variant
的完全相同的问题。
按照惯例,如果使用boost::blank
,则应始终将其作为第一个模板参数,以便默认构造的变量为空,并使用.which() == 0
检查是否为空。