Namespaces
Variants

Standard library header <format> (C++20)

From cppreference.net
Standard library headers

Este encabezado es parte de la biblioteca de procesamiento de texto .

Contenidos

Conceptos

especifica que un tipo es formateable, es decir, especializa std::formatter y proporciona las funciones miembro parse y format
(concept)

Enumeraciones

especifica cómo debe formatearse un rango
(enum)

Clases

(C++20)
define las reglas de formato para un tipo dado
(plantilla de clase)
plantilla de clase que ayuda a implementar std::formatter especializaciones para tipos de rango
(plantilla de clase)
estado del analizador de cadenas de formato
(plantilla de clase)
estado de formato, incluyendo todos los argumentos de formato y el iterador de salida
(plantilla de clase)
plantilla de clase que proporciona acceso a un argumento de formato para formateadores definidos por el usuario
(plantilla de clase)
clase que proporciona acceso a todos los argumentos de formato
(plantilla de clase)
plantilla de clase que realiza comprobaciones de cadenas de formato en tiempo de compilación durante la construcción
(plantilla de clase)
tipo de excepción lanzada en errores de formato
(clase)
Especializaciones de Formatter
soporte de formato para pair y tuple
(especialización de plantilla de clase)
soporte de formato para rangos
(especialización de plantilla de clase)

Funciones

(C++20)
almacena la representación formateada de los argumentos en una nueva cadena
(plantilla de función)
(C++20)
escribe una representación formateada de sus argumentos a través de un iterador de salida
(plantilla de función)
escribe una representación formateada de sus argumentos a través de un iterador de salida, sin exceder el tamaño especificado
(plantilla de función)
determina el número de caracteres necesarios para almacenar la representación formateada de sus argumentos
(plantilla de función)
crea cadenas de formato en tiempo de ejecución directamente utilizables en funciones de formato orientadas al usuario
(función)
(C++20)
variante no plantilla de std::format que utiliza representación de argumentos con borrado de tipo
(función)
(C++20)
variante no template de std::format_to usando representación de argumentos con borrado de tipo
(plantilla de función)
(C++20) (deprecated in C++26)
interfaz de visita de argumentos para formateadores definidos por el usuario
(plantilla de función)
crea un objeto con borrado de tipo que referencia todos los argumentos de formato, convertible a format_args
(plantilla de función)

Ayudantes

selecciona un std::range_format adecuado para un rango
(plantilla de variable)
indica que el tipo de argumento puede ser impreso eficientemente
(plantilla de variable)

Sinopsis

namespace std {
  // plantilla de clase basic_format_context
  template<class Out, class CharT> class basic_format_context;
  using format_context = basic_format_context</* sin especificar */, char>;
  using wformat_context = basic_format_context</* sin especificar */, wchar_t>;
  // class template basic_format_args
  template<class Context> class basic_format_args;
  using format_args = basic_format_args<format_context>;
  using wformat_args = basic_format_args<wformat_context>;
  // plantilla de clase basic_format_string
  template<class CharT, class... Args> struct basic_format_string;
  template<class CharT> struct /*cadena-de-formato-en-tiempo-de-ejecución*/
  {                                   // exposición-solamente
  private:
    basic_string_view<CharT> /*str*/; // exposición-solamente
  public:
    /*cadena-de-formato-en-tiempo-de-ejecución*/(basic_string_view<CharT> s) noexcept
      : /*str*/(s)
    {
    }
    /*cadena-de-formato-en-tiempo-de-ejecución*/(const /*cadena-de-formato-en-tiempo-de-ejecución*/&) = delete;
    /*cadena-de-formato-en-tiempo-de-ejecución*/& operator=(const /*cadena-de-formato-en-tiempo-de-ejecución*/&) = delete;
  };
  /*cadena-de-formato-en-tiempo-de-ejecución*/<char> runtime_format(string_view fmt) noexcept { return fmt; }
  /*cadena-de-formato-en-tiempo-de-ejecución*/<wchar_t> runtime_format(wstring_view fmt) noexcept
  {
    return fmt;
  }
  template<class... Args>
  using format_string = basic_format_string<char, type_identity_t<Args>...>;
  template<class... Args>
  using wformat_string = basic_format_string<wchar_t, type_identity_t<Args>...>;
  // funciones de formato
  template<class... Args> string format(format_string<Args...> fmt, Args&&... args);
  template<class... Args> wstring format(wformat_string<Args...> fmt, Args&&... args);
  template<class... Args>
  string format(const locale& loc, format_string<Args...> fmt, Args&&... args);
  template<class... Args>
  wstring format(const locale& loc, wformat_string<Args...> fmt, Args&&... args);
  string vformat(string_view fmt, format_args args);
  wstring vformat(wstring_view fmt, wformat_args args);
  string vformat(const locale& loc, string_view fmt, format_args args);
  wstring vformat(const locale& loc, wstring_view fmt, wformat_args args);
  template<class Out, class... Args>
  Out format_to(Out out, format_string<Args...> fmt, Args&&... args);
  template<class Out, class... Args>
  Out format_to(Out out, wformat_string<Args...> fmt, Args&&... args);
  template<class Out, class... Args>
  Out format_to(Out out, const locale& loc, format_string<Args...> fmt, Args&&... args);
  template<class Out, class... Args>
  Out format_to(Out out, const locale& loc, wformat_string<Args...> fmt, Args&&... args);
  template<class Out> Out vformat_to(Out out, string_view fmt, format_args args);
  template<class Out> Out vformat_to(Out out, wstring_view fmt, wformat_args args);
  template<class Out>
  Out vformat_to(Out out, const locale& loc, string_view fmt, format_args args);
  template<class Out>
  Out vformat_to(Out out, const locale& loc, wstring_view fmt, wformat_args args);
  template<class Out> struct format_to_n_result
  {
    Out out;
    iter_difference_t<Out> size;
  };
  template<class Out, class... Args>
  format_to_n_result<Out> format_to_n(Out out,
                                      iter_difference_t<Out> n,
                                      format_string<Args...> fmt,
                                      Args&&... args);
  template<class Out, class... Args>
  format_to_n_result<Out> format_to_n(Out out,
                                      iter_difference_t<Out> n,
                                      wformat_string<Args...> fmt,
                                      Args&&... args);
  template<class Out, class... Args>
  format_to_n_result<Out> format_to_n(Out out,
                                      iter_difference_t<Out> n,
                                      const locale& loc,
                                      format_string<Args...> fmt,
                                      Args&&... args);
  template<class Out, class... Args>
  format_to_n_result<Out> format_to_n(Out out,
                                      iter_difference_t<Out> n,
                                      const locale& loc,
                                      wformat_string<Args...> fmt,
                                      Args&&... args);
  template<class... Args>
  size_t formatted_size(format_string<Args...> fmt, Args&&... args);
  template<class... Args>
  size_t formatted_size(wformat_string<Args...> fmt, Args&&... args);
  template<class... Args>
  size_t formatted_size(const locale& loc, format_string<Args...> fmt, Args&&... args);
  template<class... Args>
  size_t formatted_size(const locale& loc, wformat_string<Args...> fmt, Args&&... args);
  // formatter
  template<class T, class CharT = char> struct formatter;
  // bloqueo de formateador
  template<class T> constexpr bool enable_nonlocking_formatter_optimization = false;
  // concepto formattable
  template<class T, class CharT>
  concept formattable = /* ver descripción */;
  template<class R, class CharT>
  concept /*const-formattable-range*/ = // exposición-solamente
    ranges::input_range<const R> &&
    formattable<ranges::range_reference_t<const R>, CharT>;
  template<class R, class CharT>
  using /*fmt-maybe-const*/ =           // exposición-solamente
    conditional_t</*const-formattable-range*/<R, CharT>, const R, R>;
  // plantilla de clase basic_format_parse_context
  template<class CharT> class basic_format_parse_context;
  using format_parse_context = basic_format_parse_context<char>;
  using wformat_parse_context = basic_format_parse_context<wchar_t>;
  // formato de rangos
  // variable template format_kind
  enum class range_format
  {
    disabled,
    map,
    set,
    sequence,
    string,
    debug_string
  };
  template<class R> constexpr /* sin especificar */ format_kind = /* sin especificar */;
  template<ranges::input_range R>
    requires same_as<R, remove_cvref_t<R>>
  constexpr range_format format_kind<R> = /* ver descripción */;
  // class template range_formatter
  template<class T, class CharT = char>
    requires same_as<remove_cvref_t<T>, T> && formattable<T, CharT>
  class range_formatter;
  // plantilla de clase range-default-formatter
  template<range_format K, ranges::input_range R, class CharT>
  struct /*range-default-formatter*/; // exposición-solamente
  // especializaciones para mapas, conjuntos y cadenas
  template<ranges::input_range R, class CharT>
    requires(format_kind<R> != range_format::deshabilitado) &&
            formattable<ranges::range_reference_t<R>, CharT>
  struct formatter<R, CharT> : /*range-default-formatter*/<format_kind<R>, R, CharT>
  {};
  template<ranges::input_range R>
    requires(format_kind<R> != range_format::deshabilitado)
  constexpr bool enable_nonlocking_formatter_optimization<R> = false;
  // argumentos
  // plantilla de clase basic_format_arg
  template<class Context> class basic_format_arg;
  // plantilla de clase format-arg-store
  template<class Context, class... Args> class /*format-arg-store*/; // exposición-solamente
  template<class Context = format_context, class... Args>
  /*format-arg-store*/<Context, Args...> make_format_args(Args&... fmt_args);
  template<class... Args>
  /*format-arg-store*/<wformat_context, Args...> make_wformat_args(Args&... args);
  // class format_error
  class format_error;
}

Plantilla de clase std::basic_format_string

namespace std {
  template<class CharT, class... Args> struct basic_format_string
  {
  private:
    basic_string_view<CharT> /*str*/; // solo para exposición
  public:
    template<class T> consteval basic_format_string(const T& s);
    basic_format_string(/*cadena-de-formato-en-tiempo-de-ejecución*/<CharT> s) noexcept
      : str(s./*str*/)
    {
    }
    constexpr basic_string_view<CharT> get() const noexcept { return /*str*/; }
  };
}

Concepto std::formattable

template<class T, class CharT>
  concepto formattable =
    semiregular<formatter<remove_cvref_t<T>, CharT>> &&
    requiere(formatter<remove_cvref_t<T>, CharT> f,
             const formatter<remove_cvref_t<T>, CharT> cf,
             T t,
             basic_format_context<__fmt_iter_for<CharT>, CharT> fc,
             basic_format_parse_context<CharT> pc) {
        { f.parse(pc) } -> same_as<basic_format_parse_context<CharT>::iterator>;
        { cf.format(t, fc) } -> same_as<__fmt_iter_for<CharT>>;
    };

Plantilla de clase std::basic_format_parse_context

namespace std {
  template<class CharT> class basic_format_parse_context
  {
  public:
    using char_type = CharT;
    using const_iterator = typename basic_string_view<CharT>::const_iterator;
    using iterator = const_iterator;
  private:
    iterator begin_;     // solo para exposición
    iterator end_;       // solo para exposición
    enum indexing
    {
      unknown,
      manual,
      automatic
    };                   // solo para exposición
    indexing indexing_;  // solo para exposición
    size_t next_arg_id_; // solo para exposición
    size_t num_args_;    // solo para exposición
  public:
    constexpr explicit basic_format_parse_context(basic_string_view<CharT> fmt) noexcept;
    basic_format_parse_context(const basic_format_parse_context&) = delete;
    basic_format_parse_context& operator=(const basic_format_parse_context&) = delete;
    constexpr const_iterator begin() const noexcept;
    constexpr const_iterator end() const noexcept;
    constexpr void advance_to(const_iterator it);
    constexpr size_t next_arg_id();
    constexpr void check_arg_id(size_t id);
    template<class... Ts> constexpr void check_dynamic_spec(size_t id) noexcept;
    constexpr void check_dynamic_spec_integral(size_t id) noexcept;
    constexpr void check_dynamic_spec_string(size_t id) noexcept;
  };
}

Plantilla de clase std::basic_format_context

namespace std {
  template<class Out, class CharT> class basic_format_context
  {
    basic_format_args<basic_format_context> args_; // solo para exposición
    Out out_;                                      // solo para exposición
    basic_format_context(const basic_format_context&) = delete;
    basic_format_context& operator=(const basic_format_context&) = delete;
  public:
    using iterator = Out;
    using char_type = CharT;
    template<class T> using formatter_type = formatter<T, CharT>;
    basic_format_arg<basic_format_context> arg(size_t id) const noexcept;
    std::locale locale();
    iterator out();
    void advance_to(iterator it);
  };
}

Plantilla de variable std::format_kind

template<ranges::input_range R>
  requires same_as<R, remove_cvref_t<R>>
constexpr range_format format_kind<R> = /* ver descripción */;

Plantilla de clase std::range_formatter

namespace std {
  template<class T, class CharT = char>
    requires same_as<remove_cvref_t<T>, T> && formattable<T, CharT>
  class range_formatter
  {
    formatter<T, CharT> /*underlying_*/; // solo exposición
    basic_string_view<CharT> /*separator_*/ =
      /*STATICALLY-WIDEN*/<CharT>(", "); // solo exposición
    basic_string_view<CharT> /*opening-bracket_*/ =
      /*STATICALLY-WIDEN*/<CharT>("[");  // solo exposición
    basic_string_view<CharT> /*closing-bracket_*/ =
      /*STATICALLY-WIDEN*/<CharT>("]");  // solo exposición
  public:
    constexpr void set_separator(basic_string_view<CharT> sep) noexcept;
    constexpr void set_brackets(basic_string_view<CharT> opening,
                                basic_string_view<CharT> closing) noexcept;
    constexpr formatter<T, CharT>& underlying() noexcept { return /*underlying_*/; }
    constexpr const formatter<T, CharT>& underlying() const noexcept
    {
      return /*underlying_*/;
    }
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<ranges::input_range R, class FormatContext>
      requires formattable<ranges::range_reference_t<R>, CharT> &&
               same_as<remove_cvref_t<ranges::range_reference_t<R>>, T>
    typename FormatContext::iterator format(R&& r, FormatContext& ctx) const;
  };
}

Plantilla de clase __range_default_formatter

namespace std {
  template<ranges::input_range R, class CharT>
  struct /*range-default-formatter*/<range_format::sequence, R, CharT>
  {                                                          // solo para exposición
  private:
    using /*maybe-const-r*/ = /*fmt-maybe-const*/<R, CharT>; // solo para exposición
    range_formatter<remove_cvref_t<ranges::range_reference_t</*maybe-const-r*/>>,
                    CharT>
      /*underlying_*/;                                       // solo para exposición
  public:
    constexpr void set_separator(basic_string_view<CharT> sep) noexcept;
    constexpr void set_brackets(basic_string_view<CharT> opening,
                                basic_string_view<CharT> closing) noexcept;
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<class FormatContext>
    typename FormatContext::iterator format(/*maybe-const-r*/& elems,
                                            FormatContext& ctx) const;
  };
}

Especialización de __range_default_formatter para maps

namespace std {
  template<ranges::input_range R, class CharT>
  struct /*range-default-formatter*/<range_format::map, R, CharT>
  {
  private:
    using /*maybe-const-map*/ = /*fmt-maybe-const*/<R, CharT>; // solo para exposición
    using /*element-type*/ =                                   // solo para exposición
      remove_cvref_t<ranges::range_reference_t</*maybe-const-map*/>>;
    range_formatter</*element-type*/, CharT> /*underlying_*/;  // solo para exposición
  public:
    constexpr /*range-default-formatter*/();
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<class FormatContext>
    typename FormatContext::iterator format(/*maybe-const-map*/& r,
                                            FormatContext& ctx) const;
  };
}

Especialización de __range_default_formatter para conjuntos

namespace std {
  template<ranges::input_range R, class CharT>
  struct /*range-default-formatter*/<range_format::set, R, CharT>
  {
  private:
    using /*maybe-const-set*/ = /*fmt-maybe-const*/<R, CharT>; // solo para exposición
    range_formatter<remove_cvref_t<ranges::range_reference_t</*maybe-const-set*/>>,
                    CharT>
      /*underlying_*/;                                         // solo para exposición
  public:
    constexpr /*range-default-formatter*/();
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<class FormatContext>
    typename FormatContext::iterator format(/*maybe-const-set*/& r,
                                            FormatContext& ctx) const;
  };
}

Especialización de __range_default_formatter para strings

namespace std {
  template<range_format K, ranges::input_range R, class CharT>
    requires(K == range_format::string || K == range_format::debug_string)
  struct /*formateador-por-defecto-para-rangos*/<K, R, CharT>
  {
  private:
    formatter<basic_string<CharT>, CharT> /*subyacente_*/; // solo-exposición
  public:
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<class FormatContext>
    typename FormatContext::iterator format(/* ver descripción */ &str,
                                            FormatContext& ctx) const;
  };
}

Plantilla de clase std::basic_format_arg

namespace std {
  template<class Context> class basic_format_arg
  {
  public:
    class handle;
  private:
    using char_type = typename Context::char_type; // solo para exposición
    variant<monostate,
            bool,
            char_type,
            int,
            unsigned int,
            long long int,
            unsigned long long int,
            float,
            double,
            long double,
            const char_type*,
            basic_string_view<char_type>,
            const void*,
            handle>
      value;                                                    // solo para exposición
    template<class T> explicit basic_format_arg(T& v) noexcept; // solo para exposición
  public:
    basic_format_arg() noexcept;
    explicit operator bool() const noexcept;
    template<class Visitor>
    decltype(auto) visit(this basic_format_arg arg, Visitor&& vis);
    template<class R, class Visitor> R visit(this basic_format_arg arg, Visitor&& vis);
  };
}

Clase std::basic_format_arg::handle

namespace std {
  template<class Context> class basic_format_arg<Context>::handle
  {
    const void* ptr_;                                   // solo para exposición
    void (*format_)(basic_format_parse_context<char_type>&,
                    Context&,
                    const void*);                       // solo para exposición
    template<class T> explicit handle(T& val) noexcept; // solo para exposición
  public:
    void format(basic_format_parse_context<char_type>&, Context& ctx) const;
  };
}

Plantilla de clase __format_arg_store

namespace std {
  template<class Context, class... Args> class /*format-arg-store*/
  {                                                             // solo para exposición
    array<basic_format_arg<Context>, sizeof...(Args)> /*args*/; // solo para exposición
  };
}

Plantilla de clase std::basic_format_args

namespace std {
  template<class Context> class basic_format_args
  {
    size_t size_;                           // solo para exposición
    const basic_format_arg<Context>* data_; // solo para exposición
  public:
    template<class... Args>
    basic_format_args(const /*format-arg-store*/<Context, Args...>& store) noexcept;
    basic_format_arg<Context> get(size_t i) const noexcept;
  };
  template<class Context, class... Args>
  basic_format_args(/*format-arg-store*/<Context, Args...>) -> basic_format_args<Context>;
}

Formateador de tuplas

namespace std {
  template<class CharT, formattable<CharT>... Ts>
  struct formatter</*pair-or-tuple*/<Ts...>, CharT>
  {
  private:
    tuple<formatter<remove_cvref_t<Ts>, CharT>...> /*underlying_*/; // solo para exposición
    basic_string_view<CharT> /*separator_*/ =
      /*STATICALLY-WIDEN*/<CharT>(", ");                            // solo para exposición
    basic_string_view<CharT> /*opening-bracket_*/ =
      /*STATICALLY-WIDEN*/<CharT>("(");                             // solo para exposición
    basic_string_view<CharT> /*closing-bracket_*/ =
      /*STATICALLY-WIDEN*/<CharT>(")");                             // solo para exposición
  public:
    constexpr void set_separator(basic_string_view<CharT> sep) noexcept;
    constexpr void set_brackets(basic_string_view<CharT> opening,
                                basic_string_view<CharT> closing) noexcept;
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<class FormatContext>
    typename FormatContext::iterator format(/* ver descripción */ &elems,
                                            FormatContext& ctx) const;
  };
  template<class... Ts>
  constexpr bool enable_nonlocking_formatter_optimization</*pair-or-tuple*/<Ts...>> =
    (enable_nonlocking_formatter_optimization<Ts> && ...);
}

Clase std::format_error

namespace std {
  class format_error : public runtime_error
  {
  public:
    constexpr explicit format_error(const string& what_arg);
    constexpr explicit format_error(const char* what_arg);
  };
}