Click here to Skip to main content
12,559,235 members (45,062 online)
Click here to Skip to main content


225 bookmarked

CString-clone Using Standard C++

, 7 Dec 2011 CPOL
A Drop-In replacement for CString that builds on the Standard C++ Library's basic_string template
// TestString.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include "StdString.h"
#include <map>
#include "resource.h"

int main(int argc, char* argv[])
	// You can add just about any form of string to a CStdString
	// with operator+()
	CStdString strVal1(_T("THIS IS A STRING   "));
	OutputDebugString(strVal1 + _T("\n"));
	strVal1 += _bstr_t(" plus a BSTR string");
	strVal1 += '.' ;

	// Some conversion functions can be chained together


	// Case INsensitive comparison via Equals() or CompareNoCase()

	strVal1 = _T("THIS IS A STRING");
	CStdString strVal2(_T("thIs Is a sTRing"));
	_ASSERTE(strVal1 != strVal2);
	_ASSERTE(strVal1.CompareNoCase(strVal2) == 0);

	// Format() works just like CString's

	strVal1.Format(_T("This %s a string named strVal%d"), _T("IS"), 1);
	OutputDebugString(strVal1 + _T("\n"));

	// Declare an STL map class which maps strings to integers.  The
	// keys are case insensitive, so an integer stored under the key
	// _T("MYKEY") could be retrieved with the value _T("mykey")

	typedef std::map<CStdString, int, StdStringLessNoCase> CMyMap;
	CMyMap myMap;
	myMap[_T("MYKEY")] = 7;
	_ASSERTE(myMap.find(_T("mykey")) != myMap.end());

	// If we were calling some windows function that fills out a
	// buffer for us we can use the GetBuffer() function.  .

	CStdString strPath;
	::GetTempPath( MAX_PATH, strPath.GetBuffer(MAX_PATH+1));

	// You can set the resource handle for loading string resources
	// and then load them via either the constructor or the Load()
	// function.

	_ASSERTE(_T("All your base are belong to us!") == strString);

	_ASSERTE(_T("I see dead people") == strString);
	return 0;

	// If this were MFC code, we could serialize the strings to CArchives:

	void  CMyObject::Serialize(CArchive& ar)
		CStdString strVal3(_T("This is a string"));
		if ( ar.IsStoring() )
			ar << strVal;
			ar >> strVal;

	// If we were implementing the IPersistStream interface on a COM
	// object which had a member CStdString variable named 'm_strVal',
	// we could take advantage of the CStdString stream functions to
	// greatly simplify the implementation as follows:

	HRESULT CMyComObject::GetSizeMax(ULARGE_INTEGER* pcbSizeMax)
		pcbSizeMax->QuadPart = m_strVal.StreamSize();
		return S_OK;
	HRESULT CMyComObject::Save(IStream* pStream, BOOL bClearDirty)
		return m_strVal.StreamSave(pStream);
	HRESULT CMyComObject::Load(IStream* pStream)
		return m_strVal.StreamLoad(pStream);


By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Joe O'Leary
Web Developer
United States United States
I've been a software developer since 1990.

While my main page is out of date (and I have therefore blanked it), you can read about the CStdString pages here

You may also be interested in...

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.161026.1 | Last Updated 7 Dec 2011
Article Copyright 2001 by Joe O'Leary
Everything else Copyright © CodeProject, 1999-2016
Layout: fixed | fluid