gpt4 book ai didi

c++ - std::codecvt::do_in 方法重载与其余基本方法

转载 作者:行者123 更新时间:2023-11-28 02:52:39 27 4
gpt4 key购买 nike

我已经重载了 do_in std::codecvt的方法| :

#include <iostream>
#include <locale>
#include <string>

class codecvt_to_upper : public std::codecvt<char, char, std::mbstate_t> {
public:

explicit codecvt_to_upper(size_t r = 0) : std::codecvt<char, char,
std::mbstate_t>(r) {}
protected:
result do_in(state_type& state, const extern_type* from,
const extern_type* from_end, const extern_type*& from_next,
intern_type* to, intern_type* to_end, intern_type*& to_next)
const;

result
do_out(state_type& __state, const intern_type* __from,
const intern_type* __from_end, const intern_type*& __from_next,
extern_type* __to, extern_type* __to_end,
extern_type*& __to_next) const {
return codecvt_to_upper::ok;
}

result
do_unshift(state_type& __state, extern_type* __to,
extern_type* __to_end, extern_type*& __to_next) const {
return codecvt_to_upper::ok;
}

int
do_encoding() const throw () {
return 1;
}

bool
do_always_noconv() const throw () {
return false;
}

int
do_length(state_type&, const extern_type* __from,
const extern_type* __end, size_t __max) const {
return 1;
}

int
do_max_length() const throw () {
return 10;
}
};

codecvt_to_upper::result codecvt_to_upper::do_in(state_type& state,
const extern_type* from, const extern_type* from_end, const
extern_type*& from_next, intern_type* to, intern_type*
to_end, intern_type*& to_next) const {
codecvt_to_upper::result res = codecvt_to_upper::error;
const std::ctype<char>& ct = std::use_facet<std::ctype<char> >(
std::locale());

const extern_type* p = from;
while( p != from_end && to != to_end) {
*to++ = ct.toupper( *p++);
}
from_next = p;
to_next = to;
res = codecvt_to_upper::ok;
return res;
}

并以这种方式使用:

int main(int argc, char** argv) {

std::locale ulocale( std::locale(), new codecvt_to_upper);

std::cin.imbue( ulocale);

char ch;
while ( std::cin >> ch) {
std::cout << ch;
}
return 0;
}

但是do_in未调用过载。我是否正确重载了它? std::codecvt<char, char, std::mbstate_t>是哪个方法(以及如何)我必须改变才能使我的方面调用do_in方法?

最佳答案

我认为首先应该解决的是 std::codecvt family facet 仅被 std::basic_filebuf 使用因为只有在与外部设备打交道时才需要进行代码转换。在您的代码中,您将语言环境设置为 std::cin ,它有一个缓冲区进行代码转换。

当然,仍然可以在程序中执行代码转换,但是阻止代码工作的方面是它继承自 std::codecvt<> 的特化。那不能做转换。 char => char特化std::codecvt<>没有定义转换,因此 do_in()不会被调用,因为没有必要在两种类型之间进行转换。

我尝试运行您的代码,但将继承的方面更改为 std::codecvt<wchar_t, char, std::mbstate>并使用宽字 rune 件流和it worked .

如果您希望它也适用于窄字符流,我建议创建一个流缓冲区,通过 underflow() 转发大写字符。 .

关于c++ - std::codecvt::do_in 方法重载与其余基本方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22688965/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com