Namespaces
Variants

std:: use_facet

From cppreference.net
Défini dans l'en-tête <locale>
template < class Facet >
const Facet & use_facet ( const std:: locale & loc ) ;

Obtient une référence à un facet implémenté par loc .

Le programme est mal formé si Facet n'est pas un facet dont la définition contient le membre statique public id ou s'il s'agit d'un facet qualifié volatile.

Table des matières

Paramètres

loc - l'objet de paramètres régionaux à interroger

Valeur de retour

Retourne une référence au facet. La référence retournée par cette fonction est valide tant qu'un objet std::locale quelconque fait référence à ce facet.

Exceptions

std::bad_cast si std:: has_facet < Facet > ( loc ) == false .

Notes

Un objet std::locale ne devrait pas être temporaire si une référence à l'objet Facet obtenu à partir de use_facet est utilisée après la fin de l'instruction :

// MAUVAIS :
auto& f = std::use_facet<std::moneypunct<char, true>>(std::locale{"no_NO.UTF-8"});
foo(f.curr_symbol()); // Erreur : f utilise en interne une référence pendante
                      // vers un objet std::locale qui n'existe plus.
// BON :
auto loc = std::locale{"is_IS.UTF-8"}; // OK : un objet non temporaire
auto& f = std::use_facet<std::moneypunct<char, true>>(loc);
foo(f.curr_symbol()); // OK : f utilise en interne une référence vers un objet locale existant.

Exemple

Affichez le nom de devise à 3 lettres utilisé par les paramètres régionaux préférés de l'utilisateur.

#include <iostream>
#include <locale>
int main()
{
    for (const char* name: {"en_US.UTF-8", "de_DE.UTF-8", "en_GB.UTF-8"})
        std::cout << "Your currency string is "
                  << std::use_facet<std::moneypunct<char, true>>(std::locale{name}).
                     curr_symbol() << '\n';
}

Sortie :

Your currency string is USD
Your currency string is EUR
Your currency string is GBP

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 Applicable à Comportement publié Comportement corrigé
LWG 31 C++98 la référence retournée restait utilisable
tant que la valeur de locale elle-même existe
la référence retournée reste utilisable tant
qu'au moins un objet locale fait référence à cette facette
LWG 38 C++98 Facet n'était pas requis d'avoir un membre direct id requis
LWG 436 C++98 il n'était pas clair si Facet peut être qualifié cv il peut être qualifié const, mais pas volatile

Voir aussi

ensemble de facettes polymorphes qui encapsulent les différences culturelles
(classe)
vérifie si une locale implémente une facette spécifique
(modèle de fonction)