public member function
<locale>

std::codecvt::length

int length (state_type& state, const extern_type* from,            const extern_type* from_end, size_t max) const;
返回转换序列的长度
返回可转换为最多 max 个内部字符的 [from,from_end) 范围内的外部字符数,如同调用 codecvt::in

state 也将更新,如同为最多 max 个内部字符的缓冲区调用了 codecvt::in 一样。

内部来说,此函数仅调用虚拟受保护成员 do_length,该成员默认按上述方式执行。

参数

state
一个 state 对象,如面实例所要求的。
通常,这是一个 mbstate_t 类型的对象,能够跟踪多字节字符转换的移位状态。
成员类型 state_type 是面类型的状态类型(定义为 codecvt 的第三个模板参数 stateT 的别名)。
from, from_end
指向源序列的初始和末尾字符的指针。使用的范围是 [from,from_end),它包含 fromfrom_end 之间的所有字符,包括 from 指向的字符,但不包括 from_end 指向的字符。
请注意,空字符被视为有效字符,不会阻止函数执行直到 from_end
成员类型 extern_type 是面类型的外部字符类型(定义为 codecvt 的第二个模板参数 exnternT 的别名)。
max
转换序列的最大长度(以内部字符为单位)。
size_t 是一个无符号整数类型。

返回值

序列字符的长度,以转换后的内部字符为单位。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// codecvt::length example
#include <iostream>       // std::wcout, std::endl
#include <locale>         // std::locale, std::codecvt, std::use_facet
#include <cwchar>         // std::mbstate_t
#include <cstddef>        // std::size_t

int main ()
{
  typedef std::codecvt<wchar_t,char,std::mbstate_t> facet_type;

  std::locale loc;
  const facet_type& myfacet = std::use_facet<facet_type>(loc);

  const char source[] = "abcdefghijklmnopqrstuvwxyz";

  // prepare objects for codecvt::length:
  std::mbstate_t mystate;
  const char * pc;
  wchar_t * pwc;

  // calculate length of dest (max 30):
  std::size_t length = myfacet.length (mystate, source, source+sizeof(source), 30);

  wchar_t* dest = new wchar_t[length];
  myfacet.in (mystate, source, source+sizeof(source), pc, dest, dest+length, pwc);

  std::wcout << dest << std::endl;

  delete[] dest;

  return 0;
}

输出

abcdefghijklmnopqrstuvwxyz


数据竞争

将访问面对象以及 [from,from_end) 范围内的所有字符。
传递给 state 的参数将被修改。

异常安全

如果抛出异常,面对象没有任何变化(尽管 state 可能已更改)。

另见