閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

message_once

最速インターフェース研究会 :: 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