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()); }