我应该使用什么来代替void作为变体中的替代类型之一

What should I use instead of void as one of the alternative types in an variant?

本文关键字:类型 什么 我应该 void      更新时间:2023-10-16

我想要一个变体,它可能包含类型Foo、(不相交的(类型Bar,或者什么都不包含。当然,我想使用std::variant<Foo, Bar, void>,但这似乎不起作用。也就是说,你可以定义这种类型,但如果你试图实例化它,你会失败(GCC 8.2(

那么我该用什么来代替呢?某种空结构?

您真正想要的是备选方案中有一个单个可能值的类型,而不是void,它没有的可能值(在其他方面也有问题(。换句话说:单元类型而不是底部类型。

作为<variant>的一部分,标准库为这个用例定义了一个"单元类型":std::monostate(是的,它本质上是一个空结构(。使用它。

示例:

#include <variant>
using Foo = int;
using Bar = double;
int main() {
std::variant<std::monostate, Foo, Bar> v; 
v = Foo{}; 
}

请注意,与问题中不同的是,单个可能的值类型是第一个备选值;这允许变体是默认可构造的,即使Foo不是。此外,以这种方式构建变体可能比构建Foo更便宜/更快,即使它是默认可构建的。