【问题标题】:restricted-use C++ computational types限制使用的 C++ 计算类型
【发布时间】:2011-07-06 05:55:54
【问题描述】:

我希望有一种方法来定义不会自动转换为它们的基本类型或相互转换的计算类型(例如,行为类似于“有限 int”的东西)——行为类似于类型指针。

例如,我希望能够定义 XCoordYCoord 类型以用于 X 和 Y 坐标。当然,我可以使用 typedef, 来做到这一点,它使我的代码更加明确,但我真正想要的是当我不小心将 Y 坐标作为函数调用参数传递时,编译器会抱怨应该使用 X 坐标。另一个用例是将尺寸单位与数字相关联,以便在有人不小心将高度以米为单位的数字添加到以克为单位的重量时获得投诉。

是的,我知道,这个例子很简单,掩盖了很多问题。我想指定数值。我想遍历值的范围。我想减去两个 XCoord 值(并得到一个 int?)。我想将它们用作数组下标。我确信有很多我没有详细考虑过的用法——虽然让它们都透明地工作会很好,但我不反对一点语法上的不便(比如成员函数调用)在某些用法中。

我大部分时间都可以看到如何使用模板和运算符重载来破解一个解决方案,并且可能会得到我想要的很多东西。但是,我希望有一个解决方案,其创建者已经完成了艰苦的工作并探索了极端情况,并在便利性和功能之间做出了适当的折衷。

当然,它们只是添加了编译时检查的基本类型——因此该解决方案相对于基本类型应该具有零运行时性能损失,就像 typedef

这样的事情存在吗?使用语言构建的解决方案是否如此复杂且充满惊喜,以至于我最好使用普通的旧 typedefs 和类似 lint 的工具来代替?如果有,有没有这样的工具?

【问题讨论】:

    标签: c++ types type-conversion


    【解决方案1】:

    我大部分时间都可以看到如何使用模板和运算符重载来破解一个解决方案,并且可能会得到我想要的很多东西。但是,我希望有一个解决方案,其创建者已经完成了艰苦的工作并探索了极端情况,并在便利性和功能之间做出了适当的折衷。

    根据我的经验,这些妥协取决于类型和应用程序。例如,从基类型构造和/或转换为基类型是否是隐式的,对类型的两个值使用按位运算符是否有意义,或逻辑运算符,前/后递增/递减,+=*= 等。其中一些东西可能可以使用 CRTP 或一个类型创建预处理器宏来选择性地和简洁地指定,该宏接受可选参数以及表示此类函数组的其他宏。我以前在几个不同的环境中做过这种事情,但我不知道有任何免费可用且同样灵活的可重用库。如果您使用宏来实现这一点,那么您可以指定类名来创建唯一类型,这很好。 (例如,请参阅 boost vault 中的 BENUM 库 - http://www.boostpro.com/vault)。 Boost 的 BOOST_STRONG_TYPEDEF 有这个好处,但缺乏灵活性。

    如果您直接使用模板,如template <typename T> class Unique { ... };,那么您会发现您无法创建两个具有相同基础(模板参数)类型的不同类型。您可以通过将一些唯一编号传递给模板来解决此问题,如template <typename T, int Id>。这需要在每次实例化模板时手动提供唯一的整数 - 维护的痛苦。如果您必须自动分配此分配并且所有使用都在一个文件中,您可以提供__LINE__(或使用宏来完成),否则也可以在 const char* 上提供模板并提供__FILE__ 或寻找编译器-特定的预处理器扩展,以生成适当的唯一数字/ID。

    【讨论】:

      【解决方案2】:

      你看过boost::units吗?

      【讨论】:

        【解决方案3】:

        我相信boost.serializationBOOST_STRONG_TYPEDEF 应该符合您的要求。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-05
          • 1970-01-01
          • 1970-01-01
          • 2013-10-09
          • 2010-12-30
          • 1970-01-01
          • 2011-10-16
          • 1970-01-01
          相关资源
          最近更新 更多