投稿数 - 437, コメント - 59540, トラックバック - 156

Curiously recurring template pattern

C++

Curiously recurring template pattern

#include <iostream>
using namespace std;
template<typename T>
class base{
public:
    void func1(){
        static_cast<T*>(this)->implementation();
    }
    void func2(){
        cout << "base" << endl;
    }
};
class delived1 : public base<delived1>{
public:
    void implementation(){
        cout << "delived1" << endl;
    }
};
void main(){
    delived1 d1;
    d1.func1();
}

こんな立派なパターン名があるとは知らなかったが、要は vtbl を使わずにポリモーフィックを実現するというものだ。

static_cast<T*>(this)

が肝。

ところで、面白いのが次のようにやってもコンパイルできる事。

class delived2 : public base<delived2>{
};
void main(){
    delived2 d2;
    d2.func2();
}

delived2 は implementation() を実装していない(実装していないどころか存在がない)ので、base のテンプレートパラメータとしては不合格なはずだが、コンパイルもできるし実行もできる。これは、func1() を呼び出していないおかげで、delived2 に implementation() があろうがなかろうが関係なくなっているため、C++ コンパイラはこれを実体化しないからである。

次のように書いた途端、コンパイルできなくなる。

void main(){
    delived2 d2;
    d2.func1();
}

投稿日時 : 2007年10月23日 22:00

フィードバック

# re: Curiously recurring template pattern

Curiously recurring template pattern は、わんくま勉強会で RAPT さんが紹介したやつ。
2007/10/23 22:01 | 囚人

# re: Curiously recurring template pattern

more c++ idioms に載ってるやつまんまですね
2007/10/23 23:05 | DEF

# re: Curiously recurring template pattern

>more c++ idioms に載ってるやつまんまですね

おー、本当ですね。クラス名までまんま一緒になってる。
という事でリンク。
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms
2007/10/23 23:13 | 囚人

# re: Curiously recurring template pattern

なるほどねー
これもまたduck-typingなんだねー
2007/10/23 23:15 | επιστημη

# re: Curiously recurring template pattern

「アヒルのように歩き、アヒルのように鳴くものはアヒルに違いないが、鳴く必要がなければクチバシはいらない」みたいな?
2007/10/23 23:52 | 囚人

# re: Curiously recurring template pattern

ATL なんかは CRTP 使いまくってますね。
初めて見たときは、なんぞこれー!って感じでしたw
2007/10/24 3:33 | melt

# re: Curiously recurring template pattern

静的多態ですね。
慣れるととても重宝します。
2007/10/24 8:53 | アキラ

# re: Curiously recurring template pattern

>ATL なんかは CRTP 使いまくってますね

ATL や WTL は多用してますね。


>静的多態ですね。

ほー、静的多態と言うんですか。なるほど。
2007/10/24 13:47 | 囚人

# re: Curiously recurring template pattern

http://ja.wikipedia.org/wiki/テンプレートメタプログラミング

このへんにも紹介されてました
2007/10/24 16:58 | アキラ

# スーパーコピー時計

relationresult「香港 に世界で有名なショッピングの天国が免税政策。

コメントの投稿

タイトル
名前
URL
コメント