Return 输入 std::optional<std::variant<...>>

Return type std::optional<std::variant<...>>

我有这样一种情况,函数必须 return 取自 table 的值。此 table 中的单元格(假设 table 正常工作...)可能包含值,也可能不包含值。该值也可以是以下几种类型之一:int, double, string, date(但不能是其他类型)。

这样的函数会是什么return? return std::optional<std::variant<std::string, int, double, std::chrono::time_point>> 是个好主意吗?

optionalvariant 的用途好吗?

我认为这是 std::monostate 的一个有用用途。具体来说,variant<std::monostate, int, double, std::string, std::chrono::time_point>monostatevariant 可能不包含值的情况下很有用。

使用实际类型而不是 optional<variant> 的好处是访问可以正常进行。您可以编写一个可以接受 monostate 参数的仿函数,从而允许您使用 visit 甚至 "empty" 变体。

只想补充一点,在 C++17 和 variantmonostate 的标准化之前,已经有 boost::blank 来解决 [=13= 完全相同的问题].

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