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>…

汎用関数においてコンセプトの不整合に対するFirewallを構成する

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>…

Template Methodパターンによる実装の半自動化を行う

加算を定義したクラスがあるとします. class C{ public: C operator+(C const &rhs) const { // 実装 } C &operator+=(C const &rhs) { // 実装 return *this; } }; 『Effective C++』でのScott Meyersの名言「intのように振舞え」,あるいは『Exceptional …

仮想関数を用いずにコードの再利用を行う

あるクラスの機能の一部を変えてコードの再利用を行う場合,変えたい機能を提供するメンバ関数を仮想関数にしてそれを派生クラスでオーバーライドするのが通常の方法ですが,CRTPを使えば仮想関数を用いずに行うことができます. 自分で何か良さそうな例を書…

CRTP(Curiously Reccursive Template Pattern)の使われ方

CRTPについてちまちま書いていたのをまとめてみました. CRTP(Curiously Reccursive/Reccuring Template Pattern)とは以下のように基底クラスのテンプレート引数として自分自身を代入するテクニックのことを指します. template class Base{/*.....*/}; cl…