ページ

2015-06-12

C++のラムダ式を利用してお手軽にOutputDebugString()を呼び出す

Windowsでデバッグ出力をしたいと思って、OutputDebugString()を呼ぼうとすると、printf的なフォーマットがないので、ちょっと文字列に数値なんかをつけたいと思うと面倒。sprintfを呼んでしまうというのもひとつだけども、バッファサイズをどうしようとか考えたくない。boost::formatがあればまぁそれをさらっと使えばいいと思うけども、今回のは「boost持ってくるほどのものでもなぁ」というサイズのコードのとき。

で、stringstream使えばいいかなということでベタで呼び出すとこうなる(OutputDebugStringWのほうがいいと思うけど、そこは適宜読み替えで)。
std::ostringstream str;
str << "Num: " << i << std::endl;
OutputDebugStringA(str.str().c_str());

sprintf呼ぶよりはいいと思うのだけど、何回も呼ぼうとするとstr変数がすでにあったりなかったりでややこしい。それで今回は、ラムダ式を使う。

このようなユーティリティ関数を用意して:
void outputDebug(std::function<void(std::ostringstream&)> func) {
 std::ostringstream str;
 func(str);
 OutputDebugStringA(str.str().c_str());
}

こう呼び出す:
outputDebug([&](std::ostringstream& s) { 
 s << "Num: " << i << std::endl;
});

どうだろう?ostringstreamの型名を書くのがちょっと悲しいけど、最初よりはいいんじゃないかなと思う。

C++らしさというのは全然わからないので、仰々しくならずにできる、もっといいやりかたがあればぜひ教えてほしい。

0 件のコメント:

コメントを投稿