タグ

関連タグで絞り込む (0)

  • 関連タグはありません

タグの絞り込みを解除

c++とC++とcrtpに関するmattnのブックマーク (4)

  • [C++]CRTP(Curiously recurring template pattern) うずまき の なんとなくでいいのかも?

    ATLライブラリ等で使用されている、自ポインタを基底クラスに渡すC++templateの手法を説明します。 ※)動作確認はVC8(VisualStudio2005)で行いました。 クラスを継承して振る舞いを変えたい場合は、仮想クラスにして変更したい関数を継承先でOverWriteするのが普通ですが、CRTPを使用すれば仮想クラスにせずとも継承先で処理の変更をすることが可能です。 ではどう言う時にそのような事を発生させたいかと言うと、下記の2点ではないかと思います。 ・動的に継承先クラスを切り替えるのではなく、コンパイル時に型が確定している時。 ・インライン展開を行いたい時。 普通の場合ですと可読性を優先して、上記の場合でも仮想クラスとすべきなのでしょうが、色々制約が出てきた場合に今回の仕組みを知っていると楽になる場合が多々あると思います。 基底クラス(template) /** * 共通

    mattn
    mattn 2010/07/30
  • 自己言及的なテンプレート (その2) - C++ Labyrinth

    自己言及的なテンプレート (その2) 以前、「自己言及的なテンプレート」 という記事を書いたが、今回はその補足である。 前回、事前に定義されているテンプレートで使用したのは、 最終的に定義されるクラスのポインタだけだったので、 template<class T> class X { public: T* foo() { } }; class A : public X <A> { }; このような自己言及的な書き方が可能なのだと思っていた。 でも、実は次のような使い方も可能なのであった。 template<class T> class X { public: static size_t getSize() { return sizeof(T); } }; class A : public X <A> { int x; }; int main() { cout ここでは、class A の

    mattn
    mattn 2010/07/30
  • More C++ Idioms/奇妙に再帰したテンプレートパターン(Curiously Recurring Template Pattern) - Wikibooks

    template <class Derived> struct base { void interface() { // ... static_cast<Derived*>(this)->implementation(); // ... } static void static_interface() { // ... Derived::static_implementation(); // ... } // デフォルトの実装は存在すれば、継承した派生クラスでオーバーライドされるかもしれないし、 // 存在しない場合は、派生クラスでしなければならない(下記参照) void implementation(); static void static_implementation(); }; // 奇妙に再帰したテンプレートパターン(Curiously Recurring Template Pa

    mattn
    mattn 2009/07/07
  • 2004-06-05

    CRTPについてちまちま書いていたのをまとめてみました. CRTP(Curiously Reccursive/Reccuring Template Pattern)とは以下のように基底クラスのテンプレート引数として自分自身を代入するテクニックのことを指します. template class Base{/*.....*/}; class C : public Base{/*.....*/}; よく見かけるパターンなので,これがどういう使われ方をしているかを適当にまとめてみました. あるクラスの機能の一部を変えてコードの再利用を行う場合,変えたい機能を提供するメンバ関数を仮想関数にしてそれを派生クラスでオーバーライドするのが通常の方法ですが,CRTPを使えば仮想関数を用いずに行うことができます. 自分で何か良さそうな例を書こうと思ったのですが,あんまり適切な例が思い浮かばないので,このCRTP

    2004-06-05
    mattn
    mattn 2009/07/06
  • 1