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>>
是个好主意吗?
optional
和 variant
的用途好吗?
我认为这是 std::monostate
的一个有用用途。具体来说,variant<std::monostate, int, double, std::string, std::chrono::time_point>
。 monostate
在 variant
可能不包含值的情况下很有用。
使用实际类型而不是 optional<variant>
的好处是访问可以正常进行。您可以编写一个可以接受 monostate
参数的仿函数,从而允许您使用 visit
甚至 "empty" 变体。
只想补充一点,在 C++17 和 variant
和 monostate
的标准化之前,已经有 boost::blank
来解决 [=13= 完全相同的问题].
按照惯例,如果使用 boost::blank
,它应该始终是第一个模板参数,以便默认构造的变体为空,并使用 .which() == 0
检查是否为空。
我有这样一种情况,函数必须 return 取自 table 的值。此 table 中的单元格(假设 table 正常工作...)可能包含值,也可能不包含值。该值也可以是以下几种类型之一:int, double, string, date
(但不能是其他类型)。
这样的函数会是什么return? return 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
甚至 "empty" 变体。
只想补充一点,在 C++17 和 variant
和 monostate
的标准化之前,已经有 boost::blank
来解决 [=13= 完全相同的问题].
按照惯例,如果使用 boost::blank
,它应该始终是第一个模板参数,以便默认构造的变体为空,并使用 .which() == 0
检查是否为空。