[英]C++ std::variant vs std::any
C ++ 17提供了std::variant
和std::any
,它们都能够在对象下存储不同类型的值。 对我来说,它们有点相似(是吗?)。
此外, std::variant
限制条目类型。 为什么我们应该更喜欢std::variant
不是std::any
哪个更易于使用?
编译时检查的内容越多,运行时错误就越少。
variant
保证它包含一个类型列表(除了异常值之外)。 它提供了一种方法,您可以保证在其上运行的代码使用std::visit
考虑变体中的每个案例; 甚至每一种情况下为一对 variant
S(或更多)。
any
没有。 与any
你能做的最好的是“如果类型不完全是我要求的,一些代码将无法运行”。
variant
存在于自动存储中。 any
可以使用免费商店; 这意味着any
variant
都没有性能和noexcept(false)
问题。
检查其中N种是在它是O(N)用于any
-为variant
是O(1)。
any
是一个装扮void*
。 variant
是一个装扮union
。
any
不能存储非复制或不移动类型。 variant
可以。
variant
的类型是代码读者的文档。
通过API传递variant<Msg1, Msg2, Msg3>
会使操作变得明显; 通过any
那里意味着理解API需要可靠的文档或阅读实现源。
任何对静态类型语言感到沮丧的人都会理解any
语言的危险性。
现在这并不意味着any
坏事; 它只是没有解决与variant
相同的问题。 作为类型擦除目的的可复制对象,它可能很棒。 运行时动态类型有它的位置; 但那个地方不是“无处不在”,而是“你无法避免的地方”。
区别在于对象存储在std::variant
分配的内存中:
cppreference.com - std :: variant
作为与工会,如果变体保持一些对象类型的值
T
, 的对象表示T
直接变体本身的对象表示内分配的。 Variant不允许分配额外的(动态)内存 。
对于std::any
这都是不可能的。
从那个std::variant
,只需要为std::variant
本身分配一个内存,它就可以保留在堆栈中。
除了从不使用额外的堆内存外, variant
还有另一个优点:
你可以std::visit
一个variant
,但不是any
variant
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.