gpt4 book ai didi

C++ std::variant 与 std::any

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:32 25 4
gpt4 key购买 nike

C++17 呈现 std::variantstd::any ,两者都能够在一个对象下存储不同类型的值。对我来说,它们有些相似(是吗?)。

此外,std::variant 还限制了条目类型,除此之外。为什么我们应该更喜欢 std::variant 而不是使用起来更简单的 std::any

最佳答案

在编译时检查的东西越多,运行时错误就越少。

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

any才不是。与 any您能做的最好的事情就是“如果类型不完全符合我的要求,某些代码将不会运行”。

variant存在于自动存储中。 any可以使用免费商店;这意味着 any有性能和noexcept(false)问题variant没有。

对于 any,检查 N 种类型中的哪一种是 O(N) -- 对于 variant它是 O(1)。

any是装扮void* . variant是装扮union .

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

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

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

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

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

关于C++ std::variant 与 std::any,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56303939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com