I have a similar problem: I work with a class called _bstr_t in COM and the ubiquitous CString for MFC, and I commonly mix them up (I have to do this as MFC does like it's own CString for some functions and working with BSTRs can be nasty), but when I can get away with it I use the standard library.
You can use a std::string and a std::stringstream with no problem, together they can easily manage your usual calls to Format. Also, I often typedef them so I can use them with UNICODE.
Code:
#include <windows.h>
#include <tchar.h>
#include <string>
#include <sstream>
//undefine both of these for UNICODE
//#define UNICODE
//#define _UNICODE
namespace TSTD
{
typedef std::basic_string<TCHAR> string;
typedef std::basic_stringstream<TCHAR> stringstream;
}
int main()
{
TSTD::stringstream ss;
TSTD::string str = _T("Hello World");
ss << _T("This is an int - ") << 10000 << std::endl;
ss << _T("This is a floating point - ") << 5.69 << std::endl;
ss << _T("This is a string - \"") << str << _T("\"");;
MessageBox(HWND_DESKTOP,ss.str().c_str(),_T(""),MB_OK);
}