GCC,std::ctype 专业化和流
GCC, std::ctype specialisation & streams
我已经为 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
每个流都使用新的语言环境?
我没有写新的class,只是提供
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 构建得到相同的结果。
编辑 - 更新 这个问题最初询问的是如何进行号码提取。然而,如果一个流充满了正确的 ctype
和 numpunct
实现,那么就不需要 num_get
的特化;简直
ss.imbue(std::locale(ss.getloc(), new std::num_get<char16_t>()));
并且它可以使用任一 gcc 版本。
同样,是否有某种方法可以让流自动选择它,而不是必须将它灌输给每个流?
使用std::locale::global()
:
std::locale::global(std::locale(std::locale(), new std::ctype<char16_t>()));
我已经为 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
每个流都使用新的语言环境?
我没有写新的class,只是提供
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 构建得到相同的结果。
编辑 - 更新 这个问题最初询问的是如何进行号码提取。然而,如果一个流充满了正确的 ctype
和 numpunct
实现,那么就不需要 num_get
的特化;简直
ss.imbue(std::locale(ss.getloc(), new std::num_get<char16_t>()));
并且它可以使用任一 gcc 版本。
同样,是否有某种方法可以让流自动选择它,而不是必须将它灌输给每个流?
使用std::locale::global()
:
std::locale::global(std::locale(std::locale(), new std::ctype<char16_t>()));