たとえば、「CDownloader」というクラスがあります。このクラスは、いくつかのXMLデータを読み取り、ノード名によるアクセスを提供します。これは、次のようないくつかのゲッター関数を備えています。
BOOL CDownloader::getInteger ( const CString &name, int *Value );
BOOL CDownloader::getImage ( const CString &name, BOOL NeedCache, CImage *Image );
BOOL CDownloader::getFont ( const CString &name, CFont *Font );
CDownloaderクラスを変更できません。代わりに、実際の名前ではなく、boolフラグを使用してアイテムをダウンロードする関数をいくつか作成したいと思います。このようなもの:
BOOL DownloadFont( const CDownloader &Loader, bool Flag, CFont *Font )
{
if (Flag) {
// first try the "name_1"
if ( Loader.getFont("name_1", Font) ) return TRUE;
}
// if "name_1" fails or disabled by flag, try "name_2"
return Loader.getFont("name_2", Font);
}
Download(Font | Integer | Image)関数を個別に記述できますが、これによりコードが重複します。私の考えはテンプレートを作成することですが、それでも途方に暮れています。CDownloaderクラスからどのメソッドを呼び出す必要があるかをどのように判断できますか?データ型ごとにテンプレートを特殊化するということは、コードの重複に再び固執することを意味します。ゲッター関数を「関数へのポインター」パラメーターとして渡すには?しかし、ゲッターの署名はCDownloaderでは異なります...
要約すると、質問は次のとおりです。CDownloaderの周りにジェネリックラッパーを作成することは可能ですか、それとも「get ***」関数ごとにコードを複製する必要がありますか?前もって感謝します!