std::vformat în C++

Formatare C++20

Formatează după un șablon cunoscut abia la rulare, de exemplu ales după limbă.

Sintaxă
#include <format>
std::string vformat(std::string_view sablon, std::format_args argumente);
auto argumente = std::make_format_args(valori...);

Ce face std::vformat

std::format verifică șablonul la compilare, deci nu acceptă un șablon citit dintr-un fișier sau ales la rulare. std::vformat primește șablonul ca text obișnuit și verifică totul la rulare.

Valorile se împachetează cu std::make_format_args(a, b, ...). Acestea trebuie să fie variabile (nu valori temporare precum 3 + 4), pentru că pachetul păstrează doar referințe la ele.

Dacă șablonul este greșit (acoladă neînchisă, prea multe marcaje, format nepotrivit), std::vformat aruncă excepția std::format_error.

Parametri

Parametru Descriere
sablon Textul cu marcaje {}, poate fi orice șir de la rulare.
argumente Rezultatul lui std::make_format_args(...).

Ce returnează

Un std::string cu textul formatat. Aruncă std::format_error dacă șablonul nu este valid.

Exemple

Exemplul 1: Mesaj în limba aleasă

#include <format>
#include <map>
#include <print>
#include <string>

int main() {
    std::map<std::string, std::string> sabloane = {
        {"ro", "Bună, {}! Ai {} mesaje noi."},
        {"en", "Hello, {}! You have {} new messages."},
    };
    std::string nume = "Ana";
    int mesaje = 4;
    for (const auto& [limba, sablon] : sabloane) {
        std::println("{}: {}", limba, std::vformat(sablon, std::make_format_args(nume, mesaje)));
    }
}

Rezultat

en: Hello, Ana! You have 4 new messages.
ro: Bună, Ana! Ai 4 mesaje noi.

Exemplul 2: Șablon greșit prins la rulare

#include <format>
#include <print>
#include <string>

int main() {
    std::string sablon = "Total: {} lei, {}";   // două marcaje, o singură valoare
    int total = 120;
    try {
        std::println("{}", std::vformat(sablon, std::make_format_args(total)));
    } catch (const std::format_error& e) {
        std::println("Șablon invalid: {}", e.what());
    }
}

Rezultat

Șablon invalid: The argument index value is too large for the number of arguments supplied

Greșeli frecvente

  • Dai valori temporare lui make_format_args: std::make_format_args(x + 1) nu compilează. Pune valoarea întâi într-o variabilă.
  • Folosești vformat peste tot: pierzi verificarea la compilare. Păstrează-l doar pentru șabloanele care chiar se aleg la rulare.

Comenzi înrudite

  • std::format: Construiește un std::string dintr-un șablon cu acolade {} și valori (C++20).
  • std::format_to: Scrie textul formatat direct într-un iterator de ieșire, de exemplu la finalul unui șir.
  • std::println: Afișează text formatat cu acolade {} și trece pe rândul următor (C++23).