Namespaces
Variants

std:: format

From cppreference.net
Défini dans l'en-tête <format>
template < class ... Args >
std:: string format ( std:: format_string < Args... > fmt, Args && ... args ) ;
(1) (depuis C++20)
template < class ... Args >
std:: wstring format ( std:: wformat_string < Args... > fmt, Args && ... args ) ;
(2) (depuis C++20)
template < class ... Args >

std:: string format ( const std:: locale & loc,

std:: format_string < Args... > fmt, Args && ... args ) ;
(3) (depuis C++20)
template < class ... Args >

std:: wstring format ( const std:: locale & loc,

std:: wformat_string < Args... > fmt, Args && ... args ) ;
(4) (depuis C++20)

Formate args selon la chaîne de format fmt , et retourne le résultat sous forme de chaîne. S'il est présent, loc est utilisé pour le formatage spécifique aux paramètres régionaux.

1) Équivalent à return std:: vformat ( fmt. get ( ) , std:: make_format_args ( args... ) ) ; .
2) Équivalent à return std:: vformat ( fmt. get ( ) , std:: make_wformat_args ( args... ) ) ; .
3) Équivalent à return std:: vformat ( loc, fmt. get ( ) , std:: make_format_args ( args... ) ) ; .
4) Équivalent à return std:: vformat ( loc, fmt. get ( ) , std:: make_wformat_args ( args... ) ) ; .

La chaîne de format fmt est vérifiée à la compilation sauf si elle est initialisée à partir du résultat de std::runtime_format (depuis C++26) . Si, à la compilation, la chaîne de format est jugée invalide pour les types des arguments à formater, une erreur de compilation sera générée.

Les exigences suivantes s'appliquent à chaque type T dans Args , où CharT est char pour les surcharges (1,3) , wchar_t pour les surcharges (2,4) :

Table des matières

Paramètres

fmt - un objet qui représente la chaîne de format. La chaîne de format est constituée de
  • caractères ordinaires (sauf { et } ), qui sont copiés inchangés vers la sortie,
  • séquences d'échappement { { et } } , qui sont remplacées respectivement par { et } dans la sortie, et
  • champs de remplacement.

Chaque champ de remplacement a le format suivant :

{ arg-id (optionnel) } (1)
{ arg-id (optionnel) : format-spec } (2)
1) champ de remplacement sans spécification de format
2) champ de remplacement avec spécification de format
arg-id - spécifie l'index de l'argument dans args dont la valeur doit être utilisée pour le formatage ; s'il est omis, les arguments sont utilisés dans l'ordre.

Les arg-id s dans une chaîne de format doivent tous être présents ou tous être omis. Mélanger l'indexation manuelle et automatique est une erreur.

format-spec - la spécification de format définie par la spécialisation std::formatter pour l'argument correspondant. Ne peut pas commencer par } .

(depuis C++23)
(depuis C++26)
  • Pour les autres types formatables, la spécification de format est déterminée par les spécialisations formatter définies par l'utilisateur.
args... - arguments à formater
loc - std::locale utilisé pour le formatage spécifique à la locale

Valeur de retour

Un objet chaîne contenant le résultat formaté.

Exceptions

Lève std::bad_alloc en cas d'échec d'allocation. Propage également toute exception levée par un formateur.

Notes

Il n'est pas une erreur de fournir plus d'arguments que ce que la chaîne de format requiert :

std::format("{} {}!", "Hello", "world", "something"); // OK, produit "Hello world!"

C'est une erreur si la chaîne de format n'est pas une expression constante sauf si elle est initialisée à partir du résultat de std::runtime_format (depuis C++26) . std::vformat n'a pas cette exigence.

std::string f1(std::string_view runtime_format_string)
{
    // return std::format(runtime_format_string, "x", 42); // erreur
    char v1[] = "x";
    int v2 = 42;
    return std::vformat(runtime_format_string, std::make_format_args(v1, v2)); // OK
}
std::string f2(std::string_view runtime_format_string)
{
    return std::format(std::runtime_format(runtime_format_string), "x", 42); // OK (C++26)
}

Exemple

#include <format>
#include <iostream>
#include <set>
#include <string>
#include <string_view>
template<typename... Args>
std::string dyna_print(std::string_view rt_fmt_str, Args&&... args)
{
    return std::vformat(rt_fmt_str, std::make_format_args(args...));
}
int main()
{
#ifdef __cpp_lib_format_ranges
        const std::set<std::string_view> continents 
        {
            "Africa",   "America",      "Antarctica",   
            "Asia",     "Australia",    "Europe"
        };
        std::cout << std::format("Hello {}!\n", continents);
#else
        std::cout << std::format("Hello {}!\n", "continents");
#endif
    std::string fmt;
    for (int i{}; i != 3; ++i)
    {
        fmt += "{} "; // construit la chaîne de formatage
        std::cout << fmt << " : ";
        std::cout << dyna_print(fmt, "alpha", 'Z', 3.14, "unused");
        std::cout << '\n';
    }
}

Sortie possible :

Hello {"Africa", "America", "Antarctica", "Asia", "Australia", "Europe"}!
{}  : alpha
{} {}  : alpha Z
{} {} {}  : alpha Z 3.14

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
P2216R3 C++20 lève std::format_error pour une chaîne de format invalide une chaîne de format invalide génère une erreur à la compilation
P2418R2 C++20 les objets qui ne sont ni const-utilisables ni copiables
(tels que les objets de type générateur) ne sont pas formatables
permettre le formatage de ces objets
P2508R1 C++20 il n'existe pas de nom visible par l'utilisateur pour cette fonctionnalité le nom basic_format_string est exposé

Voir aussi

(C++20)
écrit la représentation formatée de ses arguments via un itérateur de sortie
(modèle de fonction)
écrit la représentation formatée de ses arguments via un itérateur de sortie, sans dépasser la taille spécifiée
(modèle de fonction)