ゆとりーなの日記

日記的な事を書いて行くと思はれる

一回しか呼ばれない関数

時々一回しか呼びたくない関数とかがあったります。Boost.Threadのcall_onceとか使うのもいいですが、なんかフラグとか面倒ですし、クラスにしてしまえばstaticって書いてインスタンス作れば似たような事も出来ますがわざわざクラス作るのも面倒です。
そこでこんなのどうだろうと思って試してみました。

#include <iostream>

void only_one_call() {
  std::cout << "一回しか呼ばれない" << std::endl;
}

void hoge() {
  static const auto one = ([]() -> int {only_one_call(); return 0;})();
}

int main() {
  hoge();
  hoge();
  return 0;
}

一応only_one_call()は一回しか呼ばれませんが、戻り値がない関数の場合は適当に何か返してやらないといけないのであと一歩って感が否めません。
適当にこんな感じにクラス一個作って使いまわす方がいいですかね。

struct call_once {
  template <typename F>
  explicit call_once(const F f) {
    f();
  }
};

void foge() {
  static const call_once once(only_one_call);
}

しかしこれだとstatic付けないと仕事しないとか怠慢だろと言われかねないのでもう一段いれ込んで、

struct call_once {
  template <typename F>
  explicit call_once(const F &f) {
    static const call_once_t once(f);
  }

 private:
  struct call_once_t {
    template <typename F>
    explicit call_once_t(const F f) {
      f();
    }
  };
};

void foge() {
  const call_once once(only_one_call);
}

static不要にすればそれなりに使い道ある感が上がる気がします。