Namespaces
Variants

std::ios_base:: iword

From cppreference.net
long & iword ( int index ) ;

首先,分配或调整私有存储空间(动态数组的 long 或其他可索引数据结构)的大小,使其足以使 index 成为有效索引,然后返回私有存储空间中索引为 index long 元素的引用。

对此 ios_base 对象的任何操作(包括再次调用 iword() )均可能使引用失效,但存储的值会被保留。因此后续使用相同索引读取 iword ( index ) 将获得相同数值,直至下一次调用 std::basic_ios::copyfmt() 。该数值可用于任意用途。元素索引必须通过先前调用的 xalloc() 获取,否则行为未定义。新元素初始化为 0

若函数执行失败(可能由分配失败引起)且 * this basic_ios<> 对象或其子对象的基类子对象时,将调用 std:: basic_ios <> :: setstate ( badbit ) ,该操作可能抛出 std::ios_base::failure 异常。

目录

注释

iword存储的典型用法是通过用户定义的I/O操纵符,将信息(例如自定义格式化标志)传递给用户定义的 operator<< operator>> ,或传递给植入标准流的用户自定义格式化facet。

参数

索引 - 元素的索引值

返回值

对元素的引用。

异常

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

示例

#include <iostream>
#include <string>
struct Foo
{
    static int foo_xalloc;
    std::string data; 
    Foo(const std::string& s) : data(s) {}
};
// 为Foo对象分配iword存储空间
int Foo::foo_xalloc = std::ios_base::xalloc();
// 如果iword值为1,此用户定义operator<<将反向输出字符串
std::ostream& operator<<(std::ostream& os, Foo& f)
{
    if (os.iword(Foo::foo_xalloc) == 1)
        return os << std::string(f.data.rbegin(), f.data.rend());
    else
        return os << f.data;
}
// 此I/O操纵符将iword存储值在0和1之间切换
std::ios_base& rev(std::ios_base& os)
{
    os.iword(Foo::foo_xalloc) = !os.iword(Foo::foo_xalloc);
    return os;
}
int main()
{
    Foo f("example");
    std::cout << f << '\n' << rev << f << '\n' << rev << f << '\n';
}

输出:

example
elpmaxe
example

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 适用标准 发布时行为 正确行为
LWG 36 C++98 若引用失效则存储值可能无法保留 存储值将保留至下一次调用 copyfmt()
LWG 41 C++98 函数在失败时自行设置 badbit,
ios_base 未提供此类接口
badbit 由 basic_ios 设置
(若 * this 是其基类子对象)

参见

必要时调整私有存储大小并访问指定索引处的 void * 元素
(公开成员函数)
[静态]
返回一个全局唯一的整数值,该值可作为 pword() iword() 的安全索引使用
(公开静态成员函数)