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

ein*_*ica 5 c++ variant monostate c++17 std-variant

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

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

ein*_*ica 10

你真正想要的是具有单一可能值的备选方案中的类型- 不是void,它没有可能的值(并且在其他方​​面存在问题).换句话说:单位类型而不是底部类型.

标准库已经<variant>为此用例定义了"单元类型"的一部分:( std::monostate是的,它本质上是一个空结构).用它.

例:

#include <variant>

using Foo = int;
using Bar = double;

int main() {
    std::variant<std::monostate, Foo, Bar> v; 
    v = Foo{}; 
}
Run Code Online (Sandbox Code Playgroud)

请注意,与问题不同,单一可能值类型是一种选择; 这允许变体是默认可构造的,即使Foo不是.此外,构建变体可能比构造变量更便宜/更快Foo,即使它是默认构造的.