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

时间:2018-11-02 22:24:33

标签: c++ c++17 variant monostate std-variant

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

那我该怎么用呢?某种空结构?

1 个答案:

答案 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可能更便宜/更快,即使它是默认可构造的。