扩展std::string的一种方法

     一般情况下使用STL的通用算法和string类的方法足够解决问题了。扩展std::string的动机是因为STL是跨平台的,而在Windows下,如果使用不同的GUI库,都会用到特定的字符串类,比如MFC/ATL的CString类,QT下的QString类,wxWidgets下的wxString类,后两者还好,直接用的话就好了,但是CString不是跨平台的,而且要是之前的遗留代码是使用的string,现在要移植到对应GUI下时,一般都要大幅改动。之前的做法是,写了一个iDataTypeConvertor的类,把常用的数据类型转换算法封装成该类的静态方法,如下图所示(CString与std::string的转换):

这样每次都调用静态方法,次数一多也觉得麻烦,所以觉得有必要扩展下string,使其能够按照习惯的方式来使用(如CString的Format/Replace方法)。

扩展的方法是继承,有两篇文章写的不错,可以参考:

STL中的string扩展,使其和VC的CString融合
http://blog.csdn.net/b2b160/archive/2009/07/27/4384020.aspx
编写一个STL中的CString类
www.vckbase.com/code/relateddoc.asp?id=2049

参考第一篇文章实现的扩展类,如果类外在cpp文件中定义Replace函数,链接时会出错,而放入一个头文件中则不会出问题,还有点点疑惑。

#ifndef STDSTRINGEX__HH #define STDSTRINGEX__HH #include <atlstr.h> //For LPCTSTR #include <string> template <class T> class stdStringExImpl : public T { public: stdStringExImpl(void){} //implicit type conversion stdStringExImpl( LPCTSTR pText ):T( pText ){}; //implicit type conversion stdStringExImpl( const T& pOld ):T( pOld ){}; ~stdStringExImpl(void){} public: // CString::Replace bool Replace( LPCTSTR pOriString, LPCTSTR pNewString ) { int nStart = 0; nStart = find( pOriString ); if( nStart<0 ) return false; while( nStart>=0 ) { replace( nStart, _tcslen( pOriString ), pNewString ); nStart += _tcslen( pNewString ); nStart = find( pOriString, nStart ); } return true; } }; #endif //STDSTRINGEX__HH //For Unicode #ifdef _UNICODE typedef stdStringExImpl<std::wstring> stdStringEx; #else typedef stdStringExImpl<std::string> stdStringEx; #endif

使用:

#include "stdStringEx.h" #include <iostream> using namespace std; void main() { stdStringEx str; str = _T("abcdef"); // 所有string可用的函数都可直接使用 cout<<str<<endl; str.Replace( _T("a"), _T("b") ); // 以CString的方式调用替换函数 cout<<"Replacing..."<<endl<<str<<endl; getchar(); }

若是不想使用template,直接写:

"class stdStringEx : public std::string { };

也是的可以,其他方法都可以像这样添加进来,比如Format方法,这样就能够根据自己的要求来扩展string类了。第二篇文章中就实现了CString的所有方法,然后就能在工程中使用通用的类,方便不少。

你可能感兴趣的:(算法,windows,String,Class,扩展,跨平台)