散々騒ぎましたが・・・

気づいたら GW が終わっている。まぁ、計画も立てなければこんなもんだ。ご利用は計画的に。

こないだ散々騒ぎ散らしていたが、連休中に昔のソースを整理していたら、まさにこれと同じようなソースが出てきた。うーん、なんだったんだろう。1 年間、OCaml ばっかり書いていたせいで、些末な知識はすっぽり抜けてしまったようだ。そういえば、昔こういう書き方をしても、複数 instance ができずにコンパイルが通ってしまうことに疑問を持っていたような・・・。


もうちょっとよくみると、当時うまくいっていなかったので、こういう書き方はダメなんだろうと判断したような気がする。というのも、その問題の昔のソース(具体的には、bitboard.h)、結構へんなことをしている。private なクラスを 1 つつくって、そのコンストラクタで定数テーブルなどの初期化をやろうと企てたもの。で、その private なクラスのインスタンスを static に 1 つ持っておくと、プログラムの開始とともにコンストラクタが呼ばれて、初期化用関数が実行できるという寸法(java の static {} 風に使いたい)。こんな感じ。

class C {
private:
  class Static {
    Static() {
      init();
    }
    static Static inst_;
  };
};

C::Static C::Static::inst_;

って、書いたな。どうもうまくいっていなかったのは、C が template クラスだったので、inst_ が外から参照されないために実体化されなかった。そのためコンストラクタも呼ばれなかったからだったようだ。あー、なるほどねぇ。

となると、やっぱり定数テーブルのような初期化の必要なデータをまとめたクラスを一つ作って、singleton にすればいいんじゃないって、それで解決するな。うーん。