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

时间:2019-05-25 10:25:37

标签: c++ c++17

C ++ 17呈现std::variantstd::any,它们都能够在对象下存储不同类型的值。对我来说,它们在某种程度上是相似的(是吗?)。

此外,std::variant限制条目类型。为什么我们更喜欢使用std::variant而不是std::any

3 个答案:

答案 0 :(得分:12)

在编译时检查的内容越多,运行时的错误也越少。

variant保证它包含一种类型列表(加上无值的异常)。它为您提供了一种保证在其上运行的代码考虑带有std::visit的变体中的每种情况的方法;即使是variant(或更多)的的所有情况。

any否。使用any时,您可以做的最好的事情是“如果类型不完全符合我的要求,则某些代码将无法运行”。

variant存在于自动存储中。 any可以使用免费商店;这意味着any具有性能,而noexcept(false)则具有variant没有的性能。

对于any,检查其中N种类型为O(N);对于variant,为O(1)。

any是打扮void*variant是打扮union的人。

any无法存储不可复制或不可移动的类型。 variant可以。

variant的类型是代码阅读者的文档。

通过API传递variant<Msg1, Msg2, Msg3>使操作显而易见;在此处传递any意味着理解API需要可靠的文档或阅读实现源。

任何对静态无类型语言感到沮丧的人都将了解any的危险。

现在,这并不意味着any不好;它只是不能解决与variant相同的问题。作为用于类型擦除目的的可复制对象,它可能很棒。运行时动态类型具有它的位置;但是那个地方不是“无处不在”,而是“无法避免的地方”。

答案 1 :(得分:4)

区别在于对象存储在 devServer: { contentBase: path.join(__dirname, './application/dist'), compress: true, port: 9000 } 分配的内存中:

cppreference.com - std::variant

  

与联合一样,如果变量包含某个对象类型std::variant的值,则 T的对象表示形式将直接分配在变量本身的对象表示形式内。不允许变体分配额外的(动态)内存

并且对于T,这是不可能的。

std::any开始,std::variant本身只需要分配一次内存,并且可以保留在堆栈中。

答案 2 :(得分:2)

除了从不使用其他堆内存之外,variant还有一个优点:

您可以std::visitvariant,但不能any

相关问题