最速インターフェース研究会 :: Developer Enviroments Conference で発表してきました
にて公開されている資料にalert_onceというJavascriptで書かれた関数がありました。ループ中に何かエラーがあった時にメッセージを出したい、けど、ループ中にたくさんエラーが出るとメッセージもたくさん出て鬱陶しい! という時にこれを使うと最初の一回だけメッセージを表示できますよというもの。
これC++にも欲しいなあと思って書いてみました。
#include <iostream> #ifndef message_once #define message_once(x) {static bool f; if(!f) {std::cout << x << std::endl;} f=true;} #endif void f() { message_once("f()"); } int main() { message_once("foo"); message_once("bar"); for(int i = 0; i < 100; ++i) { message_once("for loop"); } f(); f(); return 0; }
#ifndef から #endif までがコードで、それから下は使用例。BCC5.6.4で動作確認しました。とりあえず動いているみたい。あまり考えずに書いているので動かないパターンもあるかもしれず。
まあでも、自分で使う分にはこれで十分かな。
ちなみにこれは一回書き直したもので、1分前までは以下のようになっていました。
#include <iostream> #ifndef message_once #define message_once(x) { static struct message_once_ { \ bool flag_; \ void operator()(char const* msg) { \ if(!flag_) { \ std::cout << msg << std::endl; \ } \ flag_ = true; \ } \ } message_once_object_; message_once_object_(x); } #endif
ローカルクラスなんていらなかったorz