std::codecvt<InternT,ExternT,StateT>::length, do_length
Определён в заголовке <locale> | ||
|---|---|---|
public:
int length( StateT& state, const ExternT* from, const ExternT* from_end,
std::size_t max ) const;
| (1) | |
protected:
virtual int do_length( StateT& state, const ExternT* from, const ExternT* from_end,
std::size_t max ) const;
| (2) |
1) Открытая функция-член, вызывающая функцию-член
do_length наиболее производного класса.
2) Пытается преобразовать
ExternT символов из массива символов, заданного [from, from_end), с начальным состоянием преобразования state, не более чем в max символов InternT и возвращает количество символов ExternT, которое было бы обработано при таком преобразовании. Изменяет state, как если бы выполнялся вызов do_in(state, from, from_end, from, to, to + max, to) для некоторого воображаемого выходного буфера [to, to + max).Возвращаемое значение
Количество символов ExternT, которое было бы обработано при преобразовании с помощью do_in() до тех пор, пока не будут обработаны все символы from_end - from, не будут произведены max символов InternT или не произойдёт ошибка преобразования.
Специализация без преобразования std::codecvt<char, char, std::mbstate_t> возвращает std::min(max, from_end - from).
Пример
#include <iostream>
#include <locale>
#include <string>
int main()
{
using facet_type = std::codecvt<wchar_t, char, std::mbstate_t>;
// narrow multibyte encoding
std::string s = "z\u00df\u6c34\U0001d10b"; // or u8"zß水𝄋"
// or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"
std::locale loc("en_US.UTF-8");
facet_type const& codecvt_facet = std::use_facet<facet_type>(loc);
std::mbstate_t mb = std::mbstate_t();
std::cout << "Only the first "
<< codecvt_facet.length(mb, s.data(), s.data() + s.size(), 2)
<< " bytes out of " << s.size() << " would be consumed"
" to produce the first 2 characters\n";
}
Вывод:
Only the first 3 bytes out of 10 would be consumed to produce the first 2 characters
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применялся к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 75 | C++98 | влияние на state не было определено | определено |
| LWG 305 | C++98 |
std::codecvt<wchar_t, char, std::mbstate_t>::do_lengthтребовалось возвращать std::min(max, from_end - from) | не требуется |
См. также
|
[виртуальная] | преобразует строку из ExternT в InternT, например при чтении из файла (виртуальная защищённая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/codecvt/length