开发工具VC7(VS2002)
核心代码用到MFC,测试代码用到stl
本代码功能,将容器中(数组、集合)的数据串成字符串
核心代码和扩展代码往往不是一个人完成的。 扩展代码和使用也很可能不是一个人写的。
//核心代码
template<class TYPE>
class IGetEleStr
{
public:
virtual CString GetStr(const TYPE& ele) const =0 ;
};
class IGetSpe
{
public:
virtual CString GetSpe(int index) const = 0;
};
template<class EleTypePtr,class EleType>//如果是stl的迭代器,EleTypePtr不等于EleType*
CString STLToStr(EleTypePtr begin,EleTypePtr end, const IGetEleStr<EleType>& ele, const IGetSpe& spe )
{
CString str ;
int index = 0 ;//并不是所有的迭代器都支持相减
for( EleTypePtr it = begin ; it != end ; ++ it )
{
if( 0 != index )
str += spe.GetSpe(index);
index++;
str += ele.GetStr(*it);
}
return str;
}
//扩展代码
class CGetConstSpe : public IGetSpe
{
public:
CGetConstSpe(const CString strSpe)
{
m_strSpe = strSpe;
}
virtual CString GetSpe(int index) const
{
return m_strSpe;
}
protected:
CString m_strSpe;
};
template<class EleType>
class CGetFormatStr : public IGetEleStr<EleType>
{
public:
CGetFormatStr(const CString& strFormat)
{
m_strFormat = strFormat;
}
virtual CString GetStr(const EleType& ele) const
{
CString str;
str.Format(m_strFormat,ele);
return str;
}
protected:
CString m_strFormat;
};
//测试代码
#include "afxtempl.h"
#include <set>
void Ctest1Dlg::OnBnClickedButton11()
{
int a[] = {3,4,5,6,7,8};
CString str = STLToStr(a,a+sizeof(a)/sizeof(a[0]),CGetFormatStr<int>(_T("%d")),CGetConstSpe(_T(" ")));
AfxMessageBox(str);
// CArray<float,float> f ;
f.Add(3.3);
f.Add(1.02);
f.Add(0);
f.Add(-1.33333334);
str = STLToStr(f.GetData(),f.GetData()+f.GetSize(),CGetFormatStr<float>(_T("%3.1f")),CGetConstSpe(_T(",")));
// AfxMessageBox(str);
std::set<CString> sets;
sets.insert(CString(_T("a")));
sets.insert(CString(_T("c")));
str = STLToStr(sets.begin(),sets.end(),CGetFormatStr<CString>(_T("'%s'")),CGetConstSpe(_T(",")));
AfxMessageBox(str);
}
//结果分别为:
//3 4 5 6 7 8
//3.3,1.0,0.0,-1.3
//'a','c'
class CGet2ConstSpe : public IGetSpe//索引+1为index的倍数,则用strSpe分隔,否则用strNormalSpe
{
public:
CGet2ConstSpe(const CString strNormalSpe,const CString strSpe,int index)
{
m_strNormalSpe = strNormalSpe;
m_strSpe = strSpe;
m_index = index ;
}
virtual CString GetSpe(int index) const
{
if( ( m_index > 0 ) && ( index % m_index == 0 ) )
return m_strSpe;
return m_strNormalSpe;
}
protected:
CString m_strSpe;
CString m_strNormalSpe;
int m_index;
};
void Ctest1Dlg::OnBnClickedButton12()
{
int a[] = {3,4,5,6,7,8};
CString str = STLToStr(a,a+sizeof(a)/sizeof(a[0]),CGetFormatStr<int>(_T("%d")),CGet2ConstSpe(_T(" "),_T("\r\n"),5));
AfxMessageBox(str);
}
/* 运行结果
3 4 5 6 7
8
*/
class CGetBOOLStr : public IGetEleStr<BOOL>
{
public:
CGetBOOLStr(const CString& strTrue=_T("真"),const CString& strFalse=_T("假"))
{
m_strTure = strTrue;
m_strFalse = strFalse;
}
virtual CString GetStr(const BOOL& ele) const
{
return (ele) ? m_strTure : m_strFalse ;
}
protected:
CString m_strTure;
CString m_strFalse;
};
void Ctest1Dlg::OnBnClickedButton13()
{
BOOL a[] = {TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE};
CString str = STLToStr(a,a+sizeof(a)/sizeof(a[0]),CGetBOOLStr(),CGet2ConstSpe(_T(" "),_T("\r\n"),5));
//AfxMessageBox(str);
str = STLToStr(a,a+sizeof(a)/sizeof(a[0]),CGetBOOLStr(_T("√"),_T("×")),CGet2ConstSpe(_T(" "),_T("\r\n"),5));
AfxMessageBox(str);
}
//结果分别为
/*
真 真 假 假 真
真 真
*/
/*
√ √ × × √
√ √
*/