最終更新日時: 2026年07月22日 16時08分23秒 (JST)
rotarymars が更新

履歴 編集

function template
<format>

# std::make_format_args(C++20)

    namespace std {
      template<class Context = format_context, class... Args>
      format_arg_store<Context, Args...>
        make_format_args(Args&... args);         // (1) C++20
      template<class Context = format_context, class... Args>
      constexpr format_arg_store<Context, Args...>
        make_format_args(Args&... args);         // (1) C++26

      template<class... Args>
      format_arg_store<wformat_context, Args...>
        make_wformat_args(Args&... args);        // (2) C++20
      template<class... Args>
      constexpr format_arg_store<wformat_context, Args...>
        make_wformat_args(Args&... args);        // (2) C++26
    }

## 概要

可変長引数の型を消去して、`basic_format_arg`の列に変換する。 戻り値の型 `format_arg_store` は便宜上次の通り定義されるが、その型名は規格に含まれない。

    namespace std {
      template<class Context, class... Args>
      struct format_arg_store { // exposition only
        array<basic_format_arg<Context>, sizeof...(Args)> args;
      };
    }

`basic_format_args`は`format_arg_store`から構築できる。 `make_format_args`の結果はただちに`basic_format_args`へ変換するのが意図された使い方である。

    template<class... Args>
    string format(string_view fmt, const Args&... args)
    {
      return vformat(fmt, {make_format_args(args...)}); // format_arg_store から format_args へ暗黙変換
    }

## 事前条件

すべての引数の型`Ti`について`Context::formatter_type<Ti>`が`Formatter`要件を満たすこと。

## 戻り値

### (1)

    return {basic_format_arg<Context>(args)...}

### (2)

    return make_format_args<wformat_context>(args...);

## 例

    #include <iostream>
    #include <format>
    #include <string>

    int main() {
      std::string fmt = "0x{:x} 0b{:04b}";
      int m = 10, n = 6;
      std::string s = std::vformat(fmt, std::make_format_args(m, n));
      std::cout << s << std::endl;
    }

### 出力

    0xa 0b0110

## 実装例

    namespace std {
      template<class Context = format_context, class... Args>
      format_arg_store<Context, Args...> make_format_args(const Args&... args)
      {
        return {basic_format_arg<Context>(args)...}
      }

      template<class... Args>
      format_arg_store<wformat_context, Args...> make_wformat_args(const Args&... args)
      {
        return make_format_args<wformat_context>(args...);
      }
    }

## バージョン

### 言語

- C++20

### 処理系

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

## 参照

- P0645R10 Text Formatting
- P2418R2 Add support for `std::generator`-like types to `std::format`
- P2905R2 Runtime format strings
  - C++23 発効後の DR として、引数を非 `const` 左辺値参照とすることで、一時オブジェクトを渡すことによる寿命切れオブジェクトの参照を回避する変更が提案された。これは C++20 まで遡及適用された。