gpt4 book ai didi

c++ - 如何编写一个通用的 "getData"函数?

转载 作者:行者123 更新时间:2023-11-28 03:59:48 25 4
gpt4 key购买 nike

我有一个类,比如“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 中的 getter 签名不同...

总结起来,问题是:是否可以围绕 CDownloader 编写一个通用包装器,或者我是否必须为每个“get***”函数复制代码?提前致谢!

最佳答案

只要您有三个不同命名的函数并且需要根据类型选择一个,在某些时候您就必须有一个重载或一些特征类来选择正确的一个。我认为没有办法解决这个问题。但是,由于调用这些函数之一是唯一需要它的东西,如果这些 DownloadXXX() 函数的代码比您向我们展示的更多,那么它可能仍然有意义。

下面是您可以使用重载替代方案执行的操作的草图。首先,您需要同一函数的三个重载,每个重载调用三个不同函数中的一个。其中一个函数的附加 BOOL 参数在某种程度上破坏了通用性,但我通过让所有函数都接受 BOOL 来解决这个问题,但其中两个函数忽略了它:

inline BOOL Load(CDownloader& Loader, const CString &name, int &Value, BOOL)
{return Loader.getInteger(name, &Value);

inline BOOL Load(CDownloader& Loader, const CString &name, CImage &Value, BOOL NeedCache)
{return Loader.getImage(name, NeedCache, &value);

inline BOOL Load(CDownloader& Loader, const CString &name, CFont &Value, BOOL)
{return Loader.getFont(name, &Font);

现在您可以开始编写通用函数了。不过,您需要决定如何处理该 BOOL:

template< typename T >
BOOL Download(const CDownloader &Loader, bool Flag, T &Obj, BOOL NeedCache /*= true*/)
{
if (Flag) {
if ( Load(Loader, "name_1", Obj, NeedCache) ) return TRUE;
}
return Load(Loader, "name_1", Obj, NeedCache);
}

但是,如您所见,只有当 Download 函数比您的示例代码中的复杂得多时,这才真正值得麻烦。否则,增加的复杂性很容易超过增加的通用性带来的 yield 。

关于c++ - 如何编写一个通用的 "getData"函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1433278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com