Namespaces
Variants

std:: use_facet

From cppreference.net
헤더에 정의됨 <locale>
template < class Facet >
const Facet & use_facet ( const std:: locale & loc ) ;

loc 에 의해 구현된 패싯에 대한 참조를 획득합니다.

프로그램은 Facet이 facet 이 아니거나, 그 정의에 public static 멤버 id 를 포함하지 않거나, volatile 한정된 facet인 경우 형식이 잘못되었습니다.

목차

매개변수

loc - 쿼리할 로케일 객체

반환값

해당 패싯에 대한 참조를 반환합니다. 이 함수가 반환하는 참조는 어떤 std::locale 객체라도 해당 패싯을 참조하는 한 유효합니다.

예외

std::bad_cast 가 발생합니다. 만약 std:: has_facet < Facet > ( loc ) == false 인 경우.

참고 사항

std::locale 객체는 use_facet 으로부터 얻어진 Facet 객체에 대한 참조가 문장 끝 이후에 사용되는 경우 임시 객체가 되어서는 안 됩니다:

// 나쁜 예:
auto& f = std::use_facet<std::moneypunct<char, true>>(std::locale{"no_NO.UTF-8"});
foo(f.curr_symbol()); // 오류: f가 내부적으로 더 이상 존재하지 않는
                      // std::locale 객체에 대한 댕글링 참조를 사용함
// 좋은 예:
auto loc = std::locale{"is_IS.UTF-8"}; // OK: 비임시 객체
auto& f = std::use_facet<std::moneypunct<char, true>>(loc);
foo(f.curr_symbol()); // OK: f가 내부적으로 기존 locale 객체에 대한 참조를 사용함

예제

사용자의 선호 로케일에서 사용되는 3자리 통화 이름을 표시합니다.

#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';
}

출력:

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

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 31 C++98 반환된 참조는 로케일 값 자체가 존재하는 한
계속 사용 가능했음
반환된 참조는 일부 locale 객체가 해당 facet을
참조하는 한 계속 사용 가능함
LWG 38 C++98 Facet 이 직접 멤버 id 를 가질 필요가 없었음 필요함
LWG 436 C++98 Facet 이 cv-qualified 될 수 있는지 불명확했음 const-qualified는 가능하지만 volatile-qualified는 불가능함

참고 항목

문화적 차이를 캡슐화하는 다형성 패싯들의 집합
(클래스)
로캘이 특정 패싯을 구현하는지 확인
(함수 템플릿)