繁体   English   中英

C ++ std :: variant vs std :: any

[英]C++ std::variant vs std::any

C ++ 17提供了std::variantstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM