タグ

関連タグで絞り込む (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

    意図[編集] 派生クラス自身をテンプレート引数として、基クラスを特殊化する。 別名[編集] CRTP 上からの混入(Mixin-from-above) 動機[編集] 型には依存しないが、型別にカスタマイズ可能な機能を基クラスから抽出し、それらインタフェース、属性、動作を派生クラス用にカスタマイズしてから、派生クラスに混入(mix-in)させる。 解法とサンプルコード[編集] 典型的には、基クラステンプレートは、メンバ関数の体(定義)はその宣言から非常に後になるまでインスタンス化されないという事実を活用する。そして、そのメンバ関数中で派生クラスのメンバ関数を、static_cast経由で利用する。例えば template <class Derived> struct base { void interface() { // ... static_cast<Derived*>(this

    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