9

我想要一个变体,它可能包含 Foo 类型、(不相交的)Bar 类型或什么都没有。好吧,很自然,我在考虑使用std::variant<Foo, Bar, void>- 但这似乎不起作用。也就是说,您可以定义此类型,但如果您尝试实例化此类型,则会失败(GCC 8.2)。

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

4

1 回答 1

17

您真正想要的是具有单个可能值的替代类型 - 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,即使它是默认构造的。

于 2018-11-02T22:24:33.227 回答