【问题标题】:What components are essential to a C++ project which are not found in a common library? [closed]哪些组件对于 C++ 项目是必不可少的,而这些组件在公共库中是找不到的? [关闭]
【发布时间】:2010-08-24 16:48:38
【问题描述】:

对于大多数 C++ 项目,Boost 涵盖了许多基础组件,但经常使用的解决方案和习语需要一些样板或基础工作。您认为什么如此重要以至于您将在每个项目中都拥有它并因此将它放在一个小型“图书馆”中? 我想到的一些事情:

  • 单例基类(有人会认为他需要它,所以他可以正确地做到这一点)
  • ScopeGuard
  • 工厂基类
  • any_iterator

(最后两个在 Loki 中,但 Loki 与 Boost 有重叠,人们对使用它犹豫不决。)

编辑:我可能应该补充一点,我不会询问标准库的通常扩展,例如copy_if.

【问题讨论】:

  • 这应该是社区 Wiki。
  • auto_ptr/unique_ptr 不是作用域守卫吗?此外,我认为不可能编写一个 Singleton 基类,如果是,它应该被锁定,所以没有人使用它。
  • 这是为什么呢,@Thomas?有人终于发布了关于什么应该和不应该是 CW 的指南吗?
  • @Thomas @Rob - 这是我所知道的最接近的:When to mark the ‘community wiki’ checkbox on a new question?
  • @Rob -- 我的理解是探索性问题,或者寻求意见的问题应该是CW。

标签: c++


【解决方案1】:

以上都不是。特别是,绝对不是单例类,因为单例的使用通常是 indicationdesign flaw。在过去的 15 年中,我从未需要过 Singleton 课程,而且我在旅行中发现的所有这些都是 hack,或者以其他方式损害了它们所在系统的稳健性。

一般来说,除了一个好的、符合标准的编译器、一个永远不会停止学习更多关于我选择的语言和不限制我的动作的编码标准的愿望之外,我发现我不需要任何东西来编写完整的系统。

特别值得注意的是,在过去的 15 年中,我从事的每项工作都明确禁止使用 Boost。尽管我在自己的项目中使用了 Boost,并且在我开发的一些小工具中使用了 Boost,但我的生产代码都没有使用它。我是 Boost 的粉丝,但我并没有真正错过它。而现在有了 VS2010 对 C++0x 的支持,我更加怀念它了。

也就是说,多年来,我已经制作了一个 #include 库,无论我走到哪里,我都会随身携带有用的小东西和小玩意儿。它包括:

  • 异常框架
  • std::string 一起使用的sprintf 版本
  • 我主要用于开发、压力测试和调试的高分辨率计时器类
  • transform_if 的实现
  • copy_if 的实现

还有一些我很少使用的其他 STL 扩展。

【讨论】:

  • 我已经建立了一个类似的工具箱,其中还包括 STL 容器的漂亮打印(我希望能够转储它们)、Pimpl 模板实现和其他工具。请注意,如果我没记错的话,copy_if 已进入 C++0x。最后,看到没有使用 Boost,我当然很难过。在多线程中没有boost::shared_ptr 是相当困难的,我当然通过重新实现它...
【解决方案2】:

我随身携带的大多数项目的小型图书馆包含非常实用的工具:

  • 断言实用程序(使用用户对话框发布和调试断言,其中包含“启动调试器”、“忽略此断言”、“始终忽略..”的详细信息和按钮)
  • 缓冲区实用程序可避免使用“普通”堆数组(HeapBuffer 类和带引用计数的 SharedHeapBuffer 类)
  • 伐木设施
  • UTF8 / UCS2 编码/解码
  • 配置实用程序(具有单行字符串到数字/布尔转换方法的 CfgValue 类)
  • 一些快速的字符串到数字和数字到字符串的例程
  • float 到 int 的快速转换例程
  • 在分隔实用程序上分解/分解数字/字符串
  • ini 文件解析器和编写器
  • 定时器类和一些快速而肮脏的分析工具
  • 互斥锁、条件、读/写锁、多线程实用程序(但有时我会用增强锁和线程实用程序替换越来越多的内容)
  • 轻量级消息传递系统“构造工具包”(消息、端口、发送方、处理程序、接收器、调度程序、路由器、线程接收器、线程池接收器等)

【讨论】:

    【解决方案3】:

    没有你建议的。

    单例是一种可怕的反模式,我最不希望在我的 C++ 程序中实现更多。 而且,如果您在自己的类中始终使用 RAII,则实际上不需要单独的 ScopeGuard 类。

    工厂基类?它究竟会做什么?我真的没有看到工厂之间有足够的通用功能值得放在一个通用的基类中。

    我不太确定any_iterator 是什么意思。 :)

    对 C++ 项目至关重要的东西是人们放入库中的东西。 如果某些东西不在任何公共库中,那是因为它不是通常需要的(或者因为它必须为单个项目定制,所以一个库版本没有什么价值)

    因此,您的问题基本上可以改写为“对流行的库有什么明显的补充,而这些库尚未添加到它们中”,而答案显然是“什么都没有,因为如果这个想法是很明显,图书馆作者也想到了,所以他们已经添加了它”

    【讨论】:

    • 我基本同意,但是有些东西不适合放在库中:任何一种随着开发人员经验而成熟的实用程序......例如诸如断言实用程序(标准断言太不切实际)、消息传递系统、任何“足够好”但还不够通用的“轻量级抽象”之类的东西。
    【解决方案4】:

    也许我不像其他人那样编写大量代码(专业地使用 C++ 六年),但我会:什么都没有。每当我希望一个成语出现在标准库或 Boost 中时,这表明它可能不是最好的方法。通常,您可以通过重写它们以利用现有结构更简单地表达您的概念。好的代码是简单的代码。让 Boost 背后的天才为您处理复杂的事情。

    【讨论】:

      【解决方案5】:

      环形或循环缓冲区。这是嵌入式系统中常用的数据结构。

      【讨论】:

        【解决方案6】:

        日志类(也适用于 Gui)

        【讨论】:

          【解决方案7】:

          一个或两个加密库封装在一个漂亮的界面中。

          散列算法也很有用。

          【讨论】:

            【解决方案8】:

            【讨论】:

            • 你列出的都是常用库,看来你还没有真正回答过这个问题。
            猜你喜欢
            • 1970-01-01
            • 2020-12-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-23
            • 2019-11-22
            • 1970-01-01
            • 2017-08-30
            相关资源
            最近更新 更多