我已经为std::ctype<char16_t>的每个虚拟成员函数编写了自己的特化说明,因此现在可以使用:

#include <string>
#include <locale>
#include "char16_facets.h"  // Header containing my ctype specialisation
#include <sstream>
#include <iostream>

// Implemented elsewhere using iconv
std::string Convert(std::basic_string<char16_t>);

int main() {
    std::basic_string<char16_t> s("Hello, world.");
    std::basic_stringstream<char16_t> ss(s);
    ss.imbue(std::locale(ss.getloc(), new std::ctype<char16_t>()));
    std::basic_string<char16_t> t;
    ss >> t;
    std::cout << Convert(t) << " ";
    ss >> t;
    std::cout << Convert(t) << std::endl;
}

有没有一种方法可以使流默认情况下使用新的ctype特化,因此我不必使用新的区域设置对每个流进行imbue编码?

我还没有写新课,只是提供了
template<>
inline bool std::ctype<char16_t>::do_is (std::ctype_base::mask m, char16_t c) const {

等等。我希望它会自动被拾取,只要它在我#include <sstream>之前声明就可以了,但事实并非如此。

上面的大多数工作都是使用G++和libstdc++ 4.8完成的,但是使用SVN干线构建的结果相同。

编辑-更新这个问题最初是关于如何使数字提取工作的。但是,如果流中包含正确的ctypenumpunct实现,则无需对num_get进行专门化;只是
ss.imbue(std::locale(ss.getloc(), new std::num_get<char16_t>()));

不论使用哪种gcc版本,它都可以使用。

再有,是否有某种方法可以让流自动将其拾取,而不必向每个流注入(inject)流?

最佳答案

使用std::locale::global():

std::locale::global(std::locale(std::locale(), new std::ctype<char16_t>()));

08-17 04:35