|
分類:[C/C++]
こんにちは、びーしむです。
みなさんの知識を分けてください。
C++ テンプレートテクニック本の「テンプレート引数にポインタを与える」を
元に以下のコードを書きました。
template<
typename PRM, //変更するパラメータの型
typename OBJ_CPTR, //パラメータを変更するオブジェクトのポインタ型(const)
typename PRM (*GetFunc)(OBJ_CPTR), //get関数
typename OBJ_PTR, //パラメータを変更するオブジェクトのポインタ型
typename void (*SetFunc)(OBJ_PTR, PRM)> //set関数
class Foo {
//省略
};
*** 使い方(抜粋) ***
typedef shared_ptr<Glyph> GlyphPtr_t;
typedef shared_ptr<const Glyph> GlyphCPtr_t;
void SetWidth(GlyphPtr_t p, int n){return p->SetWidth(n);}
int GetWidth(GlyphCPtr_t p){return p->GetWidth();}
{
typedef Foo<int,
GlyphCPtr_t, &GetWidth,
GlyphPtr_t, &SetWidth> Foo_t;
shared_ptr<Foo_t> pFoo(new Foo_t);
}
とりあえず、うまく動作しているので問題ないのですが、気になる点が2点あります。
良い方法があれば教えてください。
・スマートな書き方
・このような場合のセオリー
・自分ならこう書く
など
1.クラスのインスタンスを設定・取得する関数を使う場合について
CString の値を設定する場合
void SetName(GlyphPtr_t p, CString s){return p->SetName(s);}
CString GetName(GlyphCPtr_t p){return p->GetName();}
を定義すればよいのですが、自分は引数と戻り値を下記のように定義するので
void SetName(GlyphPtr_t p, const CString &s){return p->SetName(s);}
const CString GetName(GlyphCPtr_t p){return p->GetName();}
これではコンパイルできません。
Foo クラスの定義を直すだけで、対応できるのでしょうか?
(他にも PRM には、shared_ptr を使った shared_ptr<Hoge> を指定する場合もあります。)
2.shared_ptr<Foo_t> と shared_ptr<const Foo_t> をテンプレートの引数で、
OBJ_PTR, OBJ_CPTR に指定していますが、const が付いたほうを記述しない方法は
ありますか?
よろしくお願いします。
|