class definition is initialization パターンって言えばいいのかしら。クラスを定義するだけでインスタンスを自動生成する方法

クラスを定義するだけで、そのクラスインスタンスが自動的に作られて登録されたりすると便利ですよね。

たとえば、ビルド構成によって組み込まれるモジュールが変わる場合に、そのモジュールを Makefile に含めるだけで自動的サービスクラスが初期化されて登録されるとうれしい。

今回 getopt のラッパーを C++ で書いていて、そういうこと(有効な機能の設定オプションをハンドリングするサービスクラスが自動的に登録される)がやりたくなったので、書いてみた。こんな感じ。

template<typename T> class service_base {
public:
  service_base() {
    self_; // access self_ so that self_ would be initalized
  }
  virtual ~service_base() {}
  virtual void register() = 0;
private:
  T self_;
};

template<typename T> service_base::T self_;

使う側は、

class my_service : public service_base<my_service> {
public:
  ...
  virtual void register() {
    ...
  }
};

とクラスを定義するだけで、CRTP によって my_service クラスのオブジェクトが生成されるようになる。

実際のコードは hq/picoopt.h at master · kazuho/hq · GitHub のあたりにあります。既出ネタかどうかは知らない。あと C++ 規格的にこれで常に問題ないかも知らない。GCC だと動く。