我想要一个可能包含Foo类型,(不相交)Bar类型或什么都不包含的变体。好吧,自然地,我正在考虑使用std::variant<Foo, Bar, void>
-但这似乎行不通。也就是说,您可以定义此类型,但是如果尝试实例化此类型,则会失败(GCC 8.2)。
那我该怎么用呢?某种空结构?
答案 0 :(得分:9)
您真正想要的是替代类型中具有单个可能值的类型-不是void
,具有 no 可能值的类型(这是有问题的以其他方式)。换句话说:用unit type代替bottom type。
在<variant>
中,标准库为此用例定义了一个“单元类型”:std::monostate
(是的,它本质上是一个空结构)。使用它。
示例:
#include <variant>
using Foo = int;
using Bar = double;
int main() {
std::variant<std::monostate, Foo, Bar> v;
v = Foo{};
}
请注意,与问题不同,单可能值类型是 first 替代;即使Foo
不是,这也可以使变体默认构造。同样,以这种方式构造变体比构造Foo
可能更便宜/更快,即使它是默认可构造的。