我有一類,說:「CDownloader」,讀取一些XML數據,並通過節點名稱提供了訪問。它具有一些吸氣功能,如下所示:如何編寫通用的「getData」函數?
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);
}
我可以寫下載(字體|整型|圖片)功能separatly,但這樣會導致代碼重複。我的想法是編寫一個模板,但我仍然不知所措:我如何確定我應該從CDownloader類調用什麼方法?爲每個數據類型專門化模板意味着再次陷入代碼重複。將getter函數作爲「指針函數」參數傳遞?但吸氣簽名不同CDownloader ...
總結起來,問題是:是否有可能寫一個CDownloader的通用包裝或我必須重複每個「get ***」函數的代碼?提前致謝!
很難看出您試圖避免什麼樣的重複。您顯示的「DownloadFont()」有兩行:一個用於選擇名稱,另一個用於在CDownloader上調用相應的函數。我假設名稱將從一個類型到另一個不同(因此第一行必須不同),第二行也必須因爲您想調用具有不同簽名的不同CDownloader成員(所以第二行也有不同)。 – 2009-09-16 14:40:51
將使用示例更改爲更復雜。這是我試圖達到的目標。我有一個5「get ...」函數,它只有在成員函數中才有所不同,所以需要CDownloader ... – SadSido 2009-09-16 14:47:32