2004-06-05から1日間の記事一覧
上とかなり重複するCRTPの効果になると思いますが,タイトルのような効果も期待できます.上に書いたsome_processの二つの宣言 template<class T> void some_process(base<T> &r); template<class T> void some_process(T &r); では,前者の方がsome_processという関数名の導入を</class></t></class>…
template<class T> void some_process(base<T> &r); template<class T> void some_process(T &r); 上の2つの最大の違いは,後者があらゆる型Tに対してsome_processが定義されているように見えるのに対して,前者はbase<T>(の派生型)に対してのみ定義されていることです. 後者の場</t></class></t></class>…
私がCRTPを最初に知ったころは「CRTPを使って静的多相性が出来る!」と思っていたのですが,どうもこの「CRTPによって静的多相性が実現できる」という言い方はおかしいのではないか,と思い直してきました.以下に例を示します. #include <iostream> template<class T> class b</class></iostream>…
加算を定義したクラスがあるとします. class C{ public: C operator+(C const &rhs) const { // 実装 } C &operator+=(C const &rhs) { // 実装 return *this; } }; 『Effective C++』でのScott Meyersの名言「intのように振舞え」,あるいは『Exceptional …
あるクラスの機能の一部を変えてコードの再利用を行う場合,変えたい機能を提供するメンバ関数を仮想関数にしてそれを派生クラスでオーバーライドするのが通常の方法ですが,CRTPを使えば仮想関数を用いずに行うことができます. 自分で何か良さそうな例を書…
CRTPについてちまちま書いていたのをまとめてみました. CRTP(Curiously Reccursive/Reccuring Template Pattern)とは以下のように基底クラスのテンプレート引数として自分自身を代入するテクニックのことを指します. template class Base{/*.....*/}; cl…