std::ios_base:: iword
|
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()
的安全索引使用
(公开静态成员函数) |