【问题标题】:Preventing automatic casts with integers防止使用整数进行自动转换
【发布时间】:2013-08-07 15:54:43
【问题描述】:

我正在开发一个音频应用程序(在 C++ 中),并且我有很多相互调用的函数,它们要么获取帧数(即 1 个单声道或 2 个立体声浮点样本),要么获取原始样本数......

越来越难以跟踪每个函数(样本或帧?)的语义以及何时通过 nChannels 进行 mult 或 div,所以我想以某种方式执行 typedef samples_t 和 frames_t(到 unsigned int)并拥有编译器帮帮我...

是否有任何简单的方法可以将从 frames_t 到 samples_t 的隐式转换标记为 C++ 中的错误?

【问题讨论】:

标签: c++ c audio casting typedef


【解决方案1】:

您可以全力以赴在boost.units 中定义自己的系统,或者只使用BOOST_STRONG_TYPEDEF 宏为每种类型创建一个强类型定义。

【讨论】:

    【解决方案2】:

    除非 frames_t 和 samples_t 实际上是不同的类型。您可以将它们设为包含整数的 POD 结构,但对它们进行类型定义不会有任何效果。

    【讨论】:

    • 不是最漂亮的解决方案,但它实际上工作得很好......现在我至少可以保护最敏感的代码(处理堆栈从一个切换到另一个)并且我设法赶上大多数烦人的错误(很难追踪,因为它们通过播放声音和一半或两倍的速度表现出来)
    【解决方案3】:

    typedef 无法做到这一点,但 boost 可以帮助你。

    如果您想要的只是不可转换的类型,BOOST_STRONG_TYPEDEF 可以解决问题:它允许您组成多个类型,这些类型都是 unsigned,但在传递时彼此之间不可转换。

    但在您的特定应用程序中,您可能希望考虑升压单位框架,您可以在其中实际创建单位类型,其中算术结果继承适当的单位(例如freq * time 产生无单位)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 2016-07-13
      • 2022-11-30
      • 1970-01-01
      相关资源
      最近更新 更多