2007年10月12日

"基底クラスからの派生クラスのメソッドの呼び出し" と CRTP

まずはコード。

template<class Derived>
class Base {
public:
  void Process() {
    static_cast<Derived*>(this)->SubProcess();  // 派生クラスのメソッド呼び出し
  }
};

class Hoge : public Base<Hoge> {
public:
  void SubProcess() {
    std::cout << "Hoge!" << std::endl;
 }
};

派生クラスに実装した処理を基底クラスから呼び出してます。
普通なら、SubProcessメソッドはvirtualにしてBaseクラスに定義しておくところですが、virtualにするとメソッドの呼び出しに多少なりともコストがかかってしまいます。
そのコストを避けるためのカギがCRTP (Curiously Recurring Template Pattern)です。
CRTPを使えば呼び出すメソッドが静的に決まるので、うまくいけばメソッドがインライン展開されて呼び出しコストがゼロになる可能性も期待できます。

virtualにする方が一般的でわかりやすいですが、ここぞという所で使えば威力を発揮してくれそうなイディオムです。

Posted by Akihiro at 2007年10月12日 00:13
Comments
Post a comment









Remember personal info?