3

列挙型に整数を掛けるコードがあります。

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

QuantLib::Months は次のように定義されます。

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

これにより、date2がdateから 1 年後という望ましい結果が得られます。ただし、これがどのように達成されているかを理解することはできません。

これはコンパイルできないと思っていました。これで、「12 か月」オブジェクトに到達したように感じます。このオブジェクトは、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の値は です。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はから 1 時間先になります。time_point 24 * 365now

于 2014-02-25T14:34:03.877 に答える