»
(18)C++14 智能指针及引用计数*
(19)C++14 多线程pthread*
(20)C++14 同步锁mutex*
(24)C++中的计时与等待*
(25)C++中的高精度计算*
(27)C++14 std::string*
(28)C++14字符转码
(31)C++高级技能*
在C++中,有一种编程方式,叫做面向Facet编程,也就是面向部分代码编程。也就是用子类实现原有类的虚函数,同时完整地使用原有类的其他函数。从而让子类变成可以实例化的原有类的实体类。
下面是一个使用Facet编程方式实现的字符集转码的例子代码:
#include<string>
#include<locale>
#include<codecvt>
#include<utility>
#include<fstream>
#include<iostream>
//实现Facet类的析构函数的子类
template <class CodeCvtFacet>
class DeletableCodeCvt:CodeCvtFacet {
using CodeCvtFacet::CodeCvtFacet;
~DeletableCodeCvt() {}
};
typedef DeletableCodeCvt<std::codecvt_byname<wchar_t, char, std::mbstate_t>> CodeCvtFromMbToWChar;
int main(int argc,char** argv){
std::wstring_convert<CodeCvtFromMbToWChar> gb18030ToWCharConvert(new CodeCvtFromMbToWChar("zh_CN.GB18030"));
std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8Convert;
std::string line;
std::ifstream is("./gb18030_words.txt");
if(is.is_open()){
while(getline(is,line)){
std::cout<<line;
std::wstring wString = gb18030ToWCharConvert.from_bytes(line);
std::string utf8String = utf8Convert.to_bytes(wString);
std::cout<<utf8String;
}
is.close();
}else{
std::cout<<"is is not open";
}
}