std::has_facet

来自cppreference.com
< cpp‎ | locale
在标头 <locale> 定义
template< class Facet >
bool has_facet( const locale& loc ) throw();
(C++11 前)
template< class Facet >
bool has_facet( const locale& loc ) noexcept;
(C++11 起)

检查本地环境 loc 是否实装了平面 Facet

如果 Facet 不是平面或者是有 volatile 限定的平面,那么程序非良构。

参数

loc - 要查询的本地环境对象

返回值

在本地环境 loc 中安装了平面 Facet 时返回 true,否则返回 false

注解

Facet 是在这里列出的标准平面之一时,std::has_facet 必须对所有本地环境 loc 返回 true

示例

#include <iostream>
#include <locale>
 
// 最小自定义平面
struct myfacet : public std::locale::facet
{
    static std::locale::id id;
};
 
std::locale::id myfacet::id;
 
int main()
{
    // loc 是加上 myfacet 的 "C" 本地环境
    std::locale loc(std::locale::classic(), new myfacet);
    std::cout << std::boolalpha
              << "loc 是否可以分类 char?"
              << std::has_facet<std::ctype<char>>(loc) << '\n'
              << "loc 是否可以分类 char32_t?"
              << std::has_facet<std::ctype<char32_t>>(loc) << '\n'
              << "loc 是否实现了 myfacet?"
              << std::has_facet<myfacet>(loc) << '\n';
}

输出:

loc 是否可以分类 char?true
loc 是否可以分类 char32_t?false
loc 是否实现了 myfacet?true

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 436 C++98 不明确 Facet 是否可以有 cv 限定 可以有 const 限定,但不能有 volatile 限定

参阅

用来封装文化差异的多态平面的集合
(类)
从本地环境获得一个平面
(函数模板)