我应该使用什么而不是 void 作为变体中的替代类型之一?
What should I use instead of void as one of the alternative types in an variant?
我想要一个变体,它可能包含 Foo 类型、(不相交的)Bar 类型,或者什么都不包含。好吧,自然地,我在考虑使用 std::variant<Foo, Bar, void>
- 但这似乎不起作用。也就是说,您可以定义此类型,但如果您尝试实例化此类型,您将失败 (GCC 8.2)。
那我用什么代替呢?某种空结构?
您真正想要的是备选方案中的一种类型,它具有 单个 可能值 - 而不是 void
,它具有 没有 [=29] =] 可能的值(并且在其他方面存在问题)。换句话说:Aunit type instead of a bottom type。
作为 <variant>
的一部分,标准库已经为这个用例定义了一个 "unit type":std::monostate
(是的,它本质上是一个空结构)。使用它。
示例:
#include <variant>
using Foo = int;
using Bar = double;
int main() {
std::variant<std::monostate, Foo, Bar> v;
v = Foo{};
}
请注意,与问题不同的是,单可能值类型是 第一个 选项;这允许变体是默认构造的,即使 Foo
不是。此外,以这种方式构造变体可能 cheaper/faster 而不是构造 Foo
,即使它是默认构造的。
我想要一个变体,它可能包含 Foo 类型、(不相交的)Bar 类型,或者什么都不包含。好吧,自然地,我在考虑使用 std::variant<Foo, Bar, void>
- 但这似乎不起作用。也就是说,您可以定义此类型,但如果您尝试实例化此类型,您将失败 (GCC 8.2)。
那我用什么代替呢?某种空结构?
您真正想要的是备选方案中的一种类型,它具有 单个 可能值 - 而不是 void
,它具有 没有 [=29] =] 可能的值(并且在其他方面存在问题)。换句话说:Aunit type instead of a bottom type。
作为 <variant>
的一部分,标准库已经为这个用例定义了一个 "unit type":std::monostate
(是的,它本质上是一个空结构)。使用它。
示例:
#include <variant>
using Foo = int;
using Bar = double;
int main() {
std::variant<std::monostate, Foo, Bar> v;
v = Foo{};
}
请注意,与问题不同的是,单可能值类型是 第一个 选项;这允许变体是默认构造的,即使 Foo
不是。此外,以这种方式构造变体可能 cheaper/faster 而不是构造 Foo
,即使它是默认构造的。