我有一个类,比如“CDownloader”,它读取一些 XML 数据并提供节点名称的访问。它具有一些 getter 函数,如下所示:
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 类中调用什么方法?为每种数据类型专门化模板意味着再次陷入代码重复。将 getter 函数作为“函数指针”参数传递?但是吸气剂签名在 CDownloader 中有所不同......
总结起来,问题是:是否可以围绕 CDownloader 编写通用包装器,或者我是否必须为每个“get***”函数复制代码?提前致谢!