代码之家  ›  专栏  ›  技术社区  ›  Martin Ba

变型火箭科学吗?(因此,我是否应该为简单的问题而避免它?)

  •  4
  • Martin Ba  · 技术社区  · 15 年前

    好的,我的代码有一个小角落,我希望我的函数返回( int , double , CString )把代码清理一下。

    所以我想:写一个像wrapper这样的小联合没问题 struct 有三个成员等。 但是等等! 我没读过 boost::variant ? 这不正是我需要的吗?这样我就不会自己搞包装结构了!(注意,我的项目中已经有了boost库。)

    所以我启动浏览器,导航到 Chapter 28. Boost.Variant 你瞧:

    variant类模板是一个安全的、通用的、基于堆栈的区分联合容器,它提供了一个简单的解决方案,用于处理来自一组异构类型的对象[…]

    伟大的!正是我需要的!

    但接着是:

    Boost.Variant与Boost.Any

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

    [...]

    故障排除

    “内部堆限达到”——微软VisualC++——编译器选项/ZMNNN可以增加内存分配限制。NNN是缩放百分比(即100表示默认限制)。(土耳其里拉/Zm200)

    [...]

    哦哦。 因此,使用boost::variant可能会显著增加编译时间并生成难以读取的错误消息。如果有人把我对boost::variant的使用移到一个公共头上,我们的项目会突然需要更长的时间来编译吗? 我是不是在介绍一种(不必要的)复杂类型?

    我应该用 boost::变量 为了我的 简单的小 有问题吗?

    4 回复  |  直到 15 年前
        1
  •  5
  •   Diego Sevilla    15 年前

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

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

        2
  •  7
  •   lijie    15 年前

    一般来说,使用 boost::variant 如果你 想要一个受歧视的联盟( any 是针对未知类型的——可以将其视为某种等价于 void* 在C)中使用。

    一些优点包括异常处理、可能使用的空间小于类型大小之和、类型区分的“访问”。基本上,你想在受歧视的工会上表演的东西。

    然而,对于 boost::变量 为了提高效率,所使用的类型中至少有一个必须是“容易”构造的(请阅读文档了解“容易”的含义的更多详细信息)。

        3
  •  1
  •   Jack    15 年前

    这种boost元素来自函数式编程,其中 variants 在每个角落。

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

    与试图解决同一问题的其他方法相比,附加值应该是类型安全(您将无法在不注意的情况下将所需的内容放入变体中,与 void* )

        4
  •  0
  •   Simone    15 年前

    我不使用它是因为,对我来说,它是糟糕设计的症状。

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