最終更新日時: 2025年07月14日 23時04分00秒 (JST)
Koichi Murase が更新

履歴 編集

variable
<format>

# std::format_kind(C++23)

    namespace std {
      template <class R>
      constexpr unspecified format_kind = unspecified;   // (1) C++23

      template <ranges::input_range R>
        requires same_as<R, remove_cvref_t<R>>
      constexpr range_format format_kind<R> = see below; // (2) C++23
    }

## 概要

Rangeの書式種別を取得する変数テンプレート。

- (1) プライマリテンプレート。これがインスタンス化されたらプログラムは不適格となる
- (2) 入力Rangeの型`R`に応じて、書式種別を取得する

## テンプレートパラメータ制約

- (2) : 入力Rangeの型`R`は、const/volatileおよび参照で修飾されていないこと

## 効果

以下、(2)について記載する。

- `same_as<remove_cvref_t<ranges::range_reference_t<R>>, R>`が`true`である場合、値`range_format::disabled`をもつ
  - 例として、`std::filesystem::path`のような再帰的な型がこれに相当する
- `R::key_type`が有効な式である場合 (`std::map`や`std::set`が相当する)、
  - `R::mapped_type`が有効な式であり、`remove_cvref_t<ranges::range_reference_t<R>>`を`U`として、`U`が`std::pair`の特殊化もしくは`U`が`std::tuple`の特殊化で要素数が2の場合、値`range_format::map`をもつ
  - そうでない場合、値`range_format::set`をもつ
- そうでない場合、値`range_format::sequence`をもつ

## 備考

- ユーザーは、この型の特殊化を定義できる
  - ただし、その特殊化は定数式であり、型として`const range_format`をもつこと

## バージョン

### 言語

- C++23

### 処理系

- Clang: ??
- GCC: ??
- Visual C++: ??

## 関連項目

- `range_format`
- `formatter`

## 参照

- P2286R8 Formatting Ranges
- P2585R1 Improve default container formatting