3

我有一些代码将枚举乘以整数:

QuantLib::Date date2 = date + 12 * QuantLib::Months;

其中 QuantLib::Months 定义为:

enum TimeUnit { Days,
                Weeks,
                Months,
                Years
};

这给了我date2从date开始一年的期望结果。但是,我无法理解这是如何实现的。

我原以为这不会编译。现在我觉得我到达了一个“十二个月”的对象,然后由 QuantLib::Date '+' 运算符重载处理,但我以前从未见过这种风格。

我来自 C# 背景,所以在这里工作时可能有一些我不知道的事情。谁能解释发生了什么?任何参考文档将不胜感激。

4

3 回答 3

4

以下其中一项在此处生效:

  1. 在 C++ 中,枚举类型可以隐式转换为整数类型。如果这发生在这里,date + 12 * QuantLib::Months将与date + 12 * 2.

  2. 也可以为枚举类型重载运算符。在这种情况下,可能是库定义了一个返回与你正在做operator* (int, QuantLib::TimeUnit)的兼容的东西。+

我不知道QuantLib,但我猜#2 是正在发生的事情。QuantLib 文档证实了这一点(感谢@DaliborFrivaldsky 的链接)。

于 2014-02-25T14:42:49.760 回答
1

默认情况下,所有枚举基本上都是整数常量,并且作为所有整数值,您可以在算术表达式中使用它们。

在您的情况下,常量QuantLib::Months具有 value 2,因为枚举从零开始并且只是增加。


但是,除非您必须制作自己的数据/时间功能,否则我建议您使用标准库<chrono>头文件中可用的功能(如果您没有支持 C++11 的编译器/库,则使用Boost chrono )。它内置了所有这些功能。

这是一个类似于您的代码的示例

auto now = std::chrono::system_clock::now();  // The current time at the moment
auto then = now + std::chrono::hours(24 * 365);

变量then现在将是从 开始的一个小时后。time_point 24 * 365now

于 2014-02-25T14:34:03.877 回答
0

在您的示例中,您使用的是所谓的无范围枚举。每个枚举都有一个基础的整数类型(这不是必需的类型intC++ 中的枚举没有这样的默认规则)。根据 C++ 标准的第 4.5.3 段(您要求参考文档):

3 其基础类型不固定(7.2)的无作用域枚举类型的纯右值可以转换为以下第一种类型的纯右值,该类型可以表示枚举的所有值(即,bmin 到 bmax 范围内的值)如 7.2 所述):int、unsigned int、long int、unsigned long int、long long int 或 unsigned long long int。如果该列表中没有一个类型可以表示枚举的所有值,则可以将无作用域枚举类型的纯右值转换为扩展整数类型的纯右值,其最低整数转换等级 (4.13) 大于 long long 的等级其中可以表示枚举的所有值。如果有两种这样的扩展类型,则选择带符号的一种。

因此,在您的示例QuantLib::Months中转换为 int,因为枚举的所有值都可以存储在 int 类型的对象中。然后在乘法运算中执行通常的算术转换。

于 2014-02-25T14:45:53.313 回答