最終更新日時(UTC):
が更新

履歴 編集

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(const Args&... args); // (1)

  template<class... Args>
  format_arg_store<wformat_context, Args...> make_wformat_args(const Args&... args); // (2)
}

概要

可変長引数の型を消去して、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_argsformat_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要件を満たすこと。

効果

(2)は次と等しい。

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

(1)は次と等しい。

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

ただし、便宜上、basic_format_argは次のprivateメンバーを持つとする。 (これらのprivateメンバーは規格に含まれない)

namespace std {
  template<class Context>
  class basic_format_arg {
  public:
    class handle;

  private:
    using charT = typename Context::char_type;

    variant<monostate, bool, charT,
            int, unsigned int, long long int, unsigned long long int,
            double, long double,
            const charT*, basic_string_view<charT>,
            const void*, handle> value;

    template<typename T> explicit basic_format_arg(const T& v) noexcept; // (a)
    explicit basic_format_arg(float n) noexcept;                         // (b)
    explicit basic_format_arg(double n) noexcept;                        // (c)
    explicit basic_format_arg(long double n) noexcept;                   // (d)
    explicit basic_format_arg(const charT* s);                           // (e)

    template<class traits>
      explicit basic_format_arg(
        basic_string_view<charT, traits> s) noexcept;                    // (f)

    template<class traits, class Allocator>
      explicit basic_format_arg(
        const basic_string<charT, traits, Allocator>& s) noexcept;       // (g)

    explicit basic_format_arg(nullptr_t) noexcept;                       // (h)

    template<class T>
      explicit basic_format_arg(const T* p) noexcept;                    // (i)

    template<class Ctx, class... Args>
      friend format_arg_store<Ctx, Args...>
        make_format_args(const Args&... args);
  };
}

ここで、それぞれの効果は次と等しい。

  • (a):
    • TboolまたはcharTなら、valuevで初期化
    • または、TcharかつcharTwchar_tなら、valuestatic_cast<wchar_t>(v)で初期化
    • または、Tが符号つき整数型かつcharかつsizeof(T) <= sizeof(int)なら、valuestatic_cast<int>(v)で初期化
    • または、Tが符号なし整数型かつcharかつsizeof(T) <= sizeof(unsigned int)なら、valuestatic_cast<unsigned int>(v)で初期化
    • または、Tが符号つき整数型かつcharかつsizeof(T) <= sizeof(long long int)なら、valuestatic_cast<long long int>(v)で初期化
    • または、Tが符号なし整数型かつcharかつsizeof(T) <= sizeof(unsigned long long int)なら、valuestatic_cast<unsigned long long int>(v)で初期化
    • または、valuehandle(v)で初期化
  • (b): valuestatic_cast<double>(n)で初期化
  • (c): valuenで初期化
  • (d): valuenで初期化
  • (e): valuesで初期化 (sは有効なC文字列であること)
  • (f): valuesで初期化
  • (g): valuebasic_string_view<charT>(s.data(), s.size())で初期化
  • (h): valuestatic_cast<const void*>(nullptr)で初期化
  • (i): valuepで初期化 (is_void_v<T>trueであること)

戻り値

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

実装例

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

処理系

参照