GCC,std :: ctype专业化和流

时间:2015-02-06 06:58:53

标签: c++ unicode locale iostream facet

我已经为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 trunk中构建了相同的结果。

编辑 - 更新这个问题最初询问了如何使数字提取工作。但是,如果流中充满了正确的ctypenumpunct实现,则不需要num_get的专门化;简单地

ss.imbue(std::locale(ss.getloc(), new std::num_get<char16_t>()));

它可以使用gcc版本。

同样,是否有一些方法可以让流自动选择它,而不是让每个流都加入它?

1 个答案:

答案 0 :(得分:3)

使用std::locale::global()

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