我有这样一种情况:函数必须返回从表中提取的值。此表中的单元格(假设表只是工作...)可以包含一个值,也可能不是。该值也可以是几种类型中的一种:int, double, string, date
(但不包括其他类型)。
将这样一个函数返回什么?它是返回std::optional<std::variant<std::string, int, double, std::chrono::time_point>>
一个好主意?
那会是一个很好的使用optional
和variant
的?
我认为这是std::monostate
的一个有用的应用。具体来说,variant<std::monostate, int, double, std::string, std::chrono::time_point>
。 monostate
是对于其中variant
可能不包含的值的情况下是有用的。
有关使用实际类型而不是optional<variant>
的好处是,探视正常工作就可以了。你可以写一个仿函数,可以采取一个monostate
参数,从而使您可以使用visit
甚至“空”的变种。
只是想补充一点,之前的C ++ 17和variant
和monostate
的标准化,已经有boost::blank
解决完全相同的问题进行boost::variant
。
按照惯例,如果使用boost::blank
,它应该永远是第一个模板参数,使默认构造的变种是空的,用于emptyness检查与.which() == 0
完成。