我应该使用什么来代替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
,它没有的可能值(在其他方面也有问题(。换句话说:单元类型而不是底部类型。
作为<variant>
的一部分,标准库为这个用例定义了一个"单元类型":std::monostate
(是的,它本质上是一个空结构(。使用它。
示例:
#include <variant>
using Foo = int;
using Bar = double;
int main() {
std::variant<std::monostate, Foo, Bar> v;
v = Foo{};
}
请注意,与问题中不同的是,单个可能的值类型是第一个备选值;这允许变体是默认可构造的,即使Foo
不是。此外,以这种方式构建变体可能比构建Foo
更便宜/更快,即使它是默认可构建的。
相关文章:
- 我应该使用什么来代替void作为变体中的替代类型之一
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 您应该在什么时候创建自己的异常类型
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- 未命名的非类型模板参数有什么意义?
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 模板<>模板<类型名 T> 语法有什么用?
- 指针类型类成员的动态强制转换的恒定性是什么?
- 当 c++ 需要一种数据类型并获取另一种数据类型时会发生什么?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 返回类型在 C++ OOP 中是什么意思
- 如何声明一个标准::提升直方图的向量?提升直方图的类型是什么?
- 类名后跟括号的类型是什么
- 删除对象(具有不同类型)的引用时会发生什么情况?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 当你只使用 return 时,函数返回什么类型;在 c++ 中