std::ios_base::pword

来自cppreference.com
< cpp‎ | io‎ | ios base
 
 
 
 
void*& pword( int index );

首先,充分地分配或重置能确保 index 是有效索引的私有存储(void* 的动态数组或其他可索引数据结构),然后返回到带索引 index 的私有存储 void* 元素的引用。

ios_base 对象上任何其他操作都可能使返回的引用失效,包含对 pword() 的另一调用,但存储的值会保持,使得以相同索引从 pword(index) 读取将产生相同值,直到下次调用 copyfmt()。此值可用于任何目的。元素索引必须由 xalloc() 获得,否则行为未定义。初始化新元素为空指针

如果函数失败(可能由分配失败导致)并且 *this 是一个 basic_ios<> 对象或子对象的基类子对象,那么调用 std::basic_ios<>::setstate(badbit),其可能会抛出 std::ios_base::failure

参数

index - 元素的索引值

返回值

到元素的引用。

异常

设置 badbit 时可能会抛出 std::ios_base::failure

注解

如果在 pword 存储的指针要求管理,那么可以使用 register_callback() 安装按需执行深复制或解分配的处理函数。

示例

将基类 pword 存储用于派生的流对象的运行时类型鉴别。

#include <iostream>
 
template<class charT, class traits = std::char_traits<charT> >
class mystream : public std::basic_ostream<charT, traits>
{
public:
    static const int xindex;
 
    mystream(std::basic_ostream<charT, traits>& ostr) :
        std::basic_ostream<charT, traits>(ostr.rdbuf())
    {
        this->pword(xindex) = this;
    }
 
    void myfn()
    {
        *this << "【mystream 的特殊处理】";
    }
};
 
// 每个 mystream 特化从 xalloc() 获得独有的下标
template<class charT, class traits>
const int mystream<charT, traits>::xindex = std::ios_base::xalloc();
 
// 此输入/输出操纵符将能用于辨识身为 mystream 的 ostream
// 通过查找存储于 pword 的指针
template<class charT, class traits>
std::basic_ostream<charT, traits>& mymanip(std::basic_ostream<charT, traits>& os)
{
    if (os.pword(mystream<charT, traits>::xindex) == &os) 
        static_cast<mystream<charT, traits>&>(os).myfn();
    return os;
}
 
int main()
{
    std::cout << "cout,窄字符测试" << mymanip << '\n';
 
    mystream<char> myout(std::cout);
    myout << "myout,窄字符测试" << mymanip << '\n';
 
    std::wcout << "wcout,宽字符测试" << mymanip << '\n';
 
    mystream<wchar_t> mywout(std::wcout);
    mywout << "mywout,宽字符测试" << mymanip << '\n';
}

输出:

cout,窄字符测试
myout,窄字符测试【mystream 的特殊处理】
wcout,宽字符测试
mywout,宽字符测试【mystream 的特殊处理】

缺陷报告

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

缺陷报告 应用于 出版时的行为 正确行为
LWG 36 C++98 存储的值在返回的引用失效的情况下不一定会保持 存储的值在下次调用 copyfmt() 前会一直保持
LWG 41 C++98 此函数在失败时会自己设置 badbit,
ios_base 没有提供这样的接口
basic_ios 设置 badbit
(如果 *this 是它的基类子对象)

参阅

若必要则调整私有存储的大小,并访问位于给定索引的 long 元素
(公开成员函数)
[静态]
返回能安全用作 pword()iword() 的索引的程序范围内独有的整数
(公开静态成员函数)