我有一类,说:“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