stringprintf

stringprintf

ここでよく出てくる stringprintf というのは std::string用の sprintf です

デバッグ用です
例えば次のような使い方をしますが別にわざわざこんなものを用意しなくても printf で構いません

OutputDebugString( tstringprintf( _T("%d\n"), n ));
#if	defined( _vsctprintf )
inline int	basic_string_vscprintf( const char*	format, va_list	ap ){
	return	_vscprintf( &format[0], ap );
}
inline int	basic_string_vscprintf( const wchar_t*	format, va_list	ap ){
	return	_vscwprintf( &format[0], ap );
}
inline int	basic_string_vscprintf( const std::string&	format, va_list	ap ){
	return	_vscprintf( &format[0], ap );
}
inline int	basic_string_vscprintf( const std::wstring&	format, va_list	ap ){
	return	_vscwprintf( &format[0], ap );
}
#else // _vsctprintf
template<class T> inline int	basic_string_vscprintf( T, va_list ){
	return	SHRT_MAX;
}
#endif // _vsctprintf
#if	defined( _vsntprintf )
inline int	basic_string_vsnprintf( char*	s, size_t	cch, const char*	format, va_list	ap ){
	return	::_vsnprintf( s, cch, &format[0], ap );
}
inline int	basic_string_vsnprintf( wchar_t*	s, size_t	cch, const wchar_t*	format, va_list	ap ){
	return	::_vsnwprintf( s, cch, &format[0], ap );
}
inline int	basic_string_vsnprintf( std::string::pointer	s, std::string::size_type	cch, const std::string&	format, va_list	ap ){
	return	::_vsnprintf( s, cch, &format[0], ap );
}
inline int	basic_string_vsnprintf( std::wstring::pointer	s, std::wstring::size_type	cch, const std::wstring&	format, va_list	ap ){
	return	::_vsnwprintf( s, cch, &format[0], ap );
}
#else // _vsntprintf
inline int	basic_string_vsnprintf( char*	s, size_t, const char*	format, va_list	ap ){
	return	::vsprintf( s, &format[0], ap );
}
inline int	basic_string_vsnprintf( wchar_t*	s, size_t, const wchar_t*	format, va_list	ap ){
	return	::vswprintf( s, &format[0], ap );
}
inline int	basic_string_vsnprintf( std::string::pointer	s, std::string::size_type, const std::string&	format, va_list	ap ){
	return	::vsprintf( s, &format[0], ap );
}
inline int	basic_string_vsnprintf( std::wstring::pointer	s, std::wstring::size_type, const std::wstring&	format, va_list	ap ){
	return	::vswprintf( s, &format[0], ap );
}
#endif // _vsntprintf
template<class T,class U> inline T	basic_string_sprintf( U	format,... ){
	va_list	ap;
	va_start( ap, format );
	int	cch = basic_string_vscprintf( format, ap );
	T	s;
	s.resize( cch+1 );
	basic_string_vsnprintf( &s[0], s.size(), format, ap );
	s.erase( std::find( s.begin(), s.end(), 0 ), s.end());
	va_end( ap );
	return	s;
}
template<class T,class U> inline T	basic_string_vsprintf( U	format, va_list	ap ){
	int	cch = basic_string_vscprintf( format, ap );
	T	s;
	s.resize( cch+1 );
	basic_string_vsnprintf( &s[0], s.size(), format, ap );
	s.erase( std::find( s.begin(), s.end(), 0 ), s.end());
	return	s;
}

#define	stringprintf	basic_string_sprintf<std::string>
#define	vstringprintf	basic_string_vsprintf<std::string>
#define	wstringprintf	basic_string_sprintf<std::wstring>
#define	vwstringprintf	basic_string_vsprintf<std::wstring>
#if	!defined( UNICODE )
#define	tstringprintf	stringprintf
#define	vtstringprintf	vstringprintf
#else // UNICODE
#define	tstringprintf	wstringprintf
#define	vtstringprintf	vwstringprintf
#endif // UNICODE

OutputDebugString

Win32 のデバッグ出力用 API です
ここでは std::string をそのまま渡せるように次のようなオーバーロードを用意していますが、別にわざわざこんなものを使わなくても printf で構いません

inline void	OutputDebugStringW( const std::wstring&	s ){
	return	OutputDebugStringW( s.c_str());
}
inline void	OutputDebugStringA( const std::string&	s ){
	return	OutputDebugStringA( s.c_str());
}