string_printf std::string用のsprintf

C++に移るとsprintfが恋しくならないだろうか?
私は恋しくなる性質のようだ。
boost::formatを使えば一発で解決なのだが、そこまでする事は無いでしょ^^;
って方には以下の関数を薦める。*1
デースケドガーstring printfと言う事にさせてくだsine.*2
ライセンスはNYSLで。


///沢山引数をつける関数のサポート^^;
#define SET_VA_LIST(buff,buffnum,origin) \
{\
va_list VaList;\
va_start( VaList , origin ) ;\
int r;\
r = _vsnprintf( buff ,buffnum - 1, origin , VaList );\
if(0 > r){\
buff[buffnum - 1] = '\0';\
}else{\
buff[r+1] = '\0';\
}\
va_end( VaList ); \
}

std::string string_nprintf(size_t num,const char *p,...){
char *t = (char *)malloc(num);((malloc()を使っているのは趣向の問題・・・))
if(NULL==t){
throw std::runtime_error("out of memory!!!");
}
SET_VA_LIST(t,num,p);
std::string str(t);
free(t);
return str;
}

この関数を使うに当たって必要なファイル等は各自インクルードしてくだsine ^^;


ちなみに、これっぽいライブラリらしきものは存在するみたいだ。
google:string_printf http://www.ijs.si/software/snprintf/
google:string sprintf | printf

*1:バグって無ければ良いが・・・

*2:無理やりにでもデースケドガーを日記中に記述する・・・