»
(18) C++14 smart pointer and reference counter*
(19) C++14 pthread*
(20) C++14 synchronized locker--mutex*
(24) C++ time and sleep*
(25) C++ High Precision Computation*
(27) C++14 std::string*
(28) C++14 Chars Convert
(31) Advanced Level C++ Tech*
在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";
}
}