【问题标题】:Is boost::variant rocket science? (And should I therefore avoid it for simple problems?)boost::variant 火箭科学吗? (因此对于简单的问题我应该避免它吗?)
【发布时间】:2010-11-25 08:51:09
【问题描述】:

好的,所以我有我的代码的这个小角落,我希望我的函数返回(intdoubleCString)中的任何一个来清理代码。

所以我认为:用三个成员等编写一个类似联合的包装器 struct 没有问题。但是等等!我没有读过 boost::variant 吗?这不正是我需要的吗?这将使我免于自己弄乱包装器结构! (请注意,我的项目中已经有了 boost 库。)

所以我打开浏览器,导航到Chapter 28. Boost.Variant,然后瞧:

变体类模板是一个安全的、通用的、基于堆栈的可区分联合容器,提供了一种简单的解决方案,用于从一组异构类型中操作对象 [...]

太棒了!正是我需要的!

然后它继续:

Boost.Variant 与 Boost.Any

  • Boost.Any 很少使用模板元编程技术(避免潜在的难以阅读的错误消息和显着的编译时处理器和内存需求)。

[...]

疑难解答

“达到内部堆限制” -- Microsoft Visual C++ -- 编译器选项 /ZmNNN 可以增加内存分配限制。 NNN 是一个缩放百分比(即 100 表示默认限制)。 (试试 /Zm200。)

[...]

呃哦。所以使用 boost::variant 可能会显着增加编译时间并生成难以阅读的错误消息。如果有人将我对 boost::variant 的使用转移到一个公共头文件中,我们的项目会突然需要更长的时间来编译吗? 我是否引入了(不必要的)复杂类型?

我应该使用boost::variant 来解决我的simple tiny 问题吗?

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    通常,如果您确实想要一个可区分的联合,请使用boost::variantany 用于未知类型 - 将其视为某种等价于 C 中使用 void* 的方式)。

    一些优点包括异常处理、可能使用的空间少于类型大小的总和、类型区分的“访问”。基本上,你想在受歧视的联合上执行的东西。

    但是,要使boost::variant 高效,至少必须“轻松”构造其中一种类型(阅读文档以了解有关“轻松”含义的更多详细信息)。

    【讨论】:

    • 不知何故,这个答案似乎错过了这个问题。我想我问过 boost 变体是否由于其实现/高级功能而过大。它的意图用途似乎很清楚。
    • 如何判断过度杀伤力?这个问题没有具体说明如何使用可区分联合(当然,它是用于多类型返回值,但是返回值是如何使用的?)甚至关于编译时间是否会更长的问题是不适定,因为它是一个相对问题(答案取决于当前的项目规模)并且没有关于基值的信息。
    【解决方案2】:

    Boost.variant 并不复杂,恕我直言。是的,它是基于模板的,但它不使用 C++ 的任何真正复杂的特性。我用过不少,一点问题都没有。我认为在您的情况下,这将有助于更好地描述您的代码在做什么。

    另一种思维方式是将函数返回的内容转换为语义更丰富的结构/类,允许解释哪个内部元素有趣,但这取决于您的设计。

    【讨论】:

      【解决方案3】:

      这种增强元素来自函数式编程,在每个角落都有variants

      这应该是一种使用类型安全的方法来返回一种可以是多种精确类型的值的方法。这意味着这对解决您的问题很有用,但您应该考虑这是否真的是您需要做的。

      与尝试解决相同问题的其他方法相比,其附加价值应该是类型安全(您将无法在不注意的情况下将任何您想要的内容放入变体中,而不是 void*

      【讨论】:

        【解决方案4】:

        我不使用它,因为对我来说,这是糟糕设计的征兆。

        您的方法应该返回一个实现确定接口的对象,或者应该将其拆分为多个方法。无论如何,都应该审查设计。

        【讨论】:

        • 变体不是糟糕的设计,在某些情况下非常需要它们。有时,您执行的操作完全不同,具体取决于您获得的类型。
        • 这只是我的看法:对我来说,如果你不得不求助于变体,几乎总有办法改进代码设计。
        • 在 C++ 中,隐藏接口背后的差异并不是很大的改进。然后你必须求助于传递(动态分配的)指针,你会失去运行时效率。如果问题要求只返回这三种类型中的一种,那么我看不出这是个什么问题。假设它是一个解析用户输入的函数。它要么包含一个 int、一个 double 或一些其他字符串。变体类型听起来正是我想要的。
        • 你失去了运行时效率,当你必须用 if 确定 variant 真实类型时,你可能会失去这种效率切换。在这种情况下我想要什么取决于我对该输入的处理,也许总是返回一个字符串就可以了。
        • 在您处理用户输入时,运行时效率实际上并不取决于变体之类的东西。本世纪制造的任何处理器都可以跟上人类的输入。此外,输入中最昂贵的部分是格式验证,而不是填充结果的变体。
        猜你喜欢
        • 2012-03-29
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 2014-10-24
        • 2022-12-16
        • 2013-08-27
        • 2020-12-15
        • 1970-01-01
        相关资源
        最近更新 更多