最終更新日時(UTC): 2024年08月02日 05時07分35秒
Akira Takahashi が更新

履歴 編集

class
<chrono>

# std::chrono::year_month_weekday(C++20)

    namespace std::chrono {
      class year_month_weekday;
    }

## 概要

`year_month_weekday`は、年、月、N回目の曜日を表すカレンダー表現のためクラスである。

このクラスは、年、および月に関する演算に対応している。ただし、日に関する演算はできない。日を求める`day()`メンバ関数は持っておらず、日は`sys_days`への変換演算子でより効率的に求めることができる。

このクラスは等値比較ができ、EqualityComparableの要件を満たす。

このクラスは、トリビアルコピー可能で、かつスタンダードレイアウト型である。

## メンバ関数

### 構築／コピー／破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++20
`year_month_weekday& operator=(const year_month_weekday&) = default;` `year_month_weekday& operator=(year_month_weekday&&) = default;` | 代入演算子 | C++20

### 算術演算

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator+=` | 加算の複合代入 | C++20
`operator-=` | 減算の複合代入 | C++20

### 観測

名前 | 説明 | 対応バージョン
--- | --- | ---
`year` | 年要素を取得する | C++20
`month` | 月要素を取得する | C++20
`weekday` | 曜日要素を取得する | C++20
`index` | 何回目の曜日かを取得する | C++20
`weekday_indexed` | N回目の曜日要素を取得する | C++20

### 変換

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator sys_days` | システム時間の日付への型変換演算子 | C++20
`operator local_days` | ローカル時間の日付への型変換演算子 | C++20

### 検証

名前 | 説明 | 対応バージョン
--- | --- | ---
`ok` | 値が範囲に収まっているか判定する | C++20

## 非メンバ関数

### 算術演算

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator+` | 加算 | C++20
`operator-` | 減算 | C++20

### 比較演算

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較を行う | C++20
`bool operator!=(const year_month_weekday&, const year_month_weekday&) noexcept;` | 非等値比較を行う (`==`により使用可能) | C++20

### 入出力

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator<<` | 出力ストリームに出力する | C++20

## 文字列フォーマットサポート

名前 | 説明 | 対応バージョン
--- | --- | ---
`formatter` | `std::formatter`クラスの特殊化 | C++20

## ハッシュサポート

名前 | 説明 | 対応バージョン
--- | --- | ---
`template <class T> struct hash;` | `hash`クラスの先行宣言 | C++26
`template<> struct hash<chrono::year_month_weekday>;` | `hash`クラスの`year_month_weekday`に対する特殊化 | C++26

## 例

    #include <iostream>
    #include <chrono>

    using namespace std::chrono;

    int main()
    {
      // すべて2020年3月の2回目の日曜日を表す
      year_month_weekday date1 = 2020y/3/Sunday[2];
      year_month_weekday date2 = 2020y/March/Sunday[2];
      year_month_weekday date3 = March/Sunday[2]/2020y;
      year_month_weekday date4 = March/Sunday[2]/2020;

      // 各カレンダー要素のコンストラクタはexplicitなので、
      // 指定順は年、月、N回目の曜日で決まっているが、int値は指定できない
      year_month_weekday date5{2020y, March, Sunday[2]};
      std::cout << date5 << std::endl;

      // 日単位のシステム時間に変換
      sys_days sd{date5};
      std::cout << sd << std::endl;

      // 年月日に変換
      year_month_day ymd{sd};
      std::cout << ymd << std::endl;
    }

### 出力

    2020/Mar/Sun[2]
    2020-03-08
    2020-03-08

## バージョン

### 言語

- C++20

### 処理系

- Clang: 8.0 (出力ストリームなし) ✅
- GCC: 11.1 (出力ストリームなし) ✅
- Visual C++: 2019 Update 3 ❌

## 参照

- P2592R3 Hashing support for `std::chrono` value classes
  - C++26でハッシュサポートが追加された