STL有字符串处理类——stirng和wstring,但是用的时候会觉得不是很方便,因为它不能像TCHAR一样根据定义的宏在char类型字符串和wchar_t进行转换,总不能因为程序要Unicode就把所有类型转换一遍吧?有没有好办法?

答案当然是肯定的,先看看MS的TCHAR是怎么做的,以下摘自MS Platform 的tchar.h,略有删减

#ifdef _UNICODE
#ifdef __cplusplus } /* ... extern "C" */ #endif
/* ++++++++++++++++++++ UNICODE ++++++++++++++++++++ */
#include <wchar.h>
#ifdef __cplusplus extern "C" { #endif
#if !__STDC__ typedef wchar_t TCHAR; #endif ...

#ifdef _MBCS
/* ++++++++++++++++++++ MBCS ++++++++++++++++++++ */
#ifdef __cplusplus } /* ... extern "C" */ #endif
#include <mbstring.h>
#ifdef __cplusplus extern "C" { #endif

#ifndef __TCHAR_DEFINED typedef char _TCHAR; typedef signed char _TSCHAR;

#if !__STDC__ typedef char TCHAR; #endif

看到了吧,TCHAR就是根据_MBCS和_UNICODE宏来作为char和wchar_t的typedef。

下面再看看string和wstring两个类:

typedef basic_string<char, char_traits<char>, allocator<char> >  string; typedef basic_string<wchar_t, char_traits<wchar_t>,  allocator<wchar_t> > wstring; 原来string和wstring也是个typedef,都是模板basic_string的具现,既然只是个模板具现,那么其实现是不依赖于具体类型的,这也就是模板的意义——把实现从具体类型中抽象出来。

那么我们可以自己做个tstring:

typedef basic_string<TCHAR, char_traits<TCHAR>,  allocator<TCHAR> > tstring;

这样tstring就可以根据宏的不同而成为string或wstring,用的时候只需要定义需要的宏,不用大面积修改代码了。

模板赋予了STL强大的功能,一个通用的库肯定不能包容所有需要,但是良好的库应该有良好的扩展性,像string、wstring,既然不能满足日常开发中灵活的转换,那么我们就自己动手,具现一个tstring,stirng中所有的成员函数、算法都不用实现,除非你有特殊需要,因为模板已经将这些函数、算法都实现好了,我们要做的只需要具现就好了。

其实不止string和wstring,fstream和wfstream也可以像string和wstring一样,通过basic_fstream模板具现一个tfstream

这就是模板强大的威力,也只有C++拥有如此强大的能力。

在这里感谢一下Senior Fat Chan的思路

更方便的用法:

#ifdef _UNICODE
typedef wstring tstring;
#else
typedef string tstring;
#endif

STL的string和wstring的更多相关文章

  1. [C++]C++标准里 string和wstring

    typedef basic_string<char> string; typedef basic_string<wchar_t> wstring; 前者string是常用类型, ...

  2. 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换 [转]

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下. #ifndef USE_H_ #define USE_H_ # ...

  3. 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下-复制代码 代码如下:    #ifndef USE_H_     ...

  4. string 到 wstring的转换

    string 到 wstring的转换_一景_新浪博客     string 到 wstring的转换    (2009-08-10 20:52:34)    转载▼    标签:    杂谈    ...

  5. How to convert string to wstring?

    How to convert string to wstring? - Codejie's C++ Space - C++博客     How to convert string to wstring ...

  6. 利用boost做string到wstring转换,以及字符集转换 - Error - C++博客

    利用boost做string到wstring转换,以及字符集转换 - Error - C++博客 利用boost做string到wstring转换,以及字符集转换 #include <boost ...

  7. string 与wstring 的转换

    std::wstring StringToWString(const std::string &str) { std::wstring wstr(str.length(),L' '); std ...

  8. STL基础--String

    String 构造 string s1("Hello"); string s2("Hello", 3); //s2: Hel string s3(s1, 2); ...

  9. 基于标准库实现string和wstring的转换

    // convert string to wstring std::wstring to_wstring(const std::string& str, const std::locale&a ...

随机推荐

  1. Java集合之TreeMap

    Map的单元是对键值对的处理,之前分析过的两种Map,HashMap和LinkedHashMap都是用哈希值去寻找我们想要的键值对,优点是由O(1)的查找速度. 那如果我们在一个对查找性能要求不那么高 ...

  2. eclipse 相同变量高亮显示 颜色修改 变量着色

    问题描述:      在eclipse中使用快捷键或其他原因,不小心按错了,使得变量的高亮显示没了.   1.简单的办法:  网上搜了一下,原来是Toggle Mark Occurrences (Al ...

  3. Ubuntu系统监控cpu memery 磁盘Io次数 IO速率 网卡 运行时间等信息的采集

    实验室最近在做的项目要做ubuntu系统监控,要获得系统的一些信息并返回给web服务器. web服务器与ubuntu主机的通信我写的程序用的是socket,至于为什么不用java程序ssh到对应的主机 ...

  4. Leveldb之version与version_set详细对比

    version类包含的重要变量: VersionSet* vset_; // VersionSet to which this Version belongs Version* next_; // N ...

  5. node应用场景

    2.1 Web开发:Express + EJS + Mongoose/MySQL express 是轻量灵活的Nodejs Web应用框架,它可以快速地搭建网站.Express框架建立在Nodejs内 ...

  6. java实验三20135104

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计                         班级:1351            姓名:刘帅      ...

  7. dispaly 的block与inline-block的用法

    一直以来没有弄清block与line-block的用法,今天花点时间整理一下. <body> <div class="div1">div1</div& ...

  8. 如何卸除SDL TRADOS中的自开发插件

    去年学着用SDL的例子编译了一个名为SimpleText的插件,每次打开TRADOS 2014时都要提示三次加载插件,很是烦人.但我想卸掉时,却无从下手,不知道怎么办.这个问题纠缠了我很久,今晨心性比 ...

  9. 基于OWIN WebAPI 使用OAUTH2授权服务【授权码模式(Authorization Code)】

    之前已经简单实现了OAUTH2的授权码模式(Authorization Code),但是基于JAVA的,今天花了点时间调试了OWIN的实现,基本就把基于OWIN的OAUHT2的四种模式实现完了.官方推 ...

  10. PL/SQL 创建视图语法

    使用create view 语句创建视图 create [or replace][force | noforce] view [user.] viewName (column [,column2].. ...