我想要一个变体,它可能包含 Foo 类型、(不相交的)Bar 类型或什么都没有。好吧,很自然,我在考虑使用std::variant<Foo, Bar, void>
- 但这似乎不起作用。也就是说,您可以定义此类型,但如果您尝试实例化此类型,则会失败(GCC 8.2)。
那我用什么代替呢?某种空结构?
我想要一个变体,它可能包含 Foo 类型、(不相交的)Bar 类型或什么都没有。好吧,很自然,我在考虑使用std::variant<Foo, Bar, void>
- 但这似乎不起作用。也就是说,您可以定义此类型,但如果您尝试实例化此类型,则会失败(GCC 8.2)。
那我用什么代替呢?某种空结构?
您真正想要的是具有单个可能值的替代类型 - not void
,它没有可能的值(并且在其他方面存在问题)。换句话说:单元类型而不是底部类型。
标准库已经为这个用例定义了<variant>
一个“单元类型”:(std::monostate
是的,它本质上是一个空结构)。用它。
例子:
#include <variant>
using Foo = int;
using Bar = double;
int main() {
std::variant<std::monostate, Foo, Bar> v;
v = Foo{};
}
请注意,与问题不同,单一可能值类型是第一种选择;这允许变体是默认可构造的,即使Foo
不是。此外,以这种方式构造变体可能比构造 a 更便宜/更快Foo
,即使它是默认构造的。