std:: use_facet
|
헤더에 정의됨
<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는 불가능함 |
참고 항목
|
문화적 차이를 캡슐화하는 다형성 패싯들의 집합
(클래스) |
|
|
로캘이 특정 패싯을 구현하는지 확인
(함수 템플릿) |