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,即使它是默认构造的.