加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中,如何使用泛型类型的映射避免显式的向下转换?

发布时间:2020-12-16 10:17:21 所属栏目:百科 来源:网络整理
导读:这有点人为,但我说我有这样的类接口: class IResource;class IResourceContainer{ public: virtual ~IResourceContainer() {} virtual void AddResource(const std::string rStrName,std::auto_ptrIResource apResource)=0; virtual IResource GetResource(
这有点人为,但我说我有这样的类接口:

class IResource;
class IResourceContainer
{
 public:
    virtual ~IResourceContainer() {}
    virtual void AddResource(const std::string& rStrName,std::auto_ptr<IResource> apResource)=0;
    virtual IResource& GetResource(const std::string& rStrName)=0; 
};

我有一个这个类的实现,它包含一个IResource类型的字符串映射.如果我要像这样添加我自己的资源:

container.AddResource("foo",std:auto_ptr<IResource>( new CFooResource);

然后检索资源引用

CFooResource& fooResource = container.GetResource(); // error

这不会编译因为我需要将IResource转发到CFooResource.我想通过让GetResource获取一个模板参数来隐藏它,这个参数在内部向下转换类型,但很明显,模板和纯接口不会生成.我目前的替代方法是在CastResource函数中隐藏转换,该函数调用boost :: polymorphic_downcast,但我仍然不满意客户端需要转换资源的想法.

例如:

CFooResource& fooResource = CastResource<CFooResource&>(container.GetResource());

所以我想我的问题是:是否有更好的方法来保存指向通用类型的指针,这些类型不需要用户进行明确的向下转换?我觉得有一种模板化的做法,但我没有看到它.此外,我创建了这个界面,以便客户可以在需要时轻松地在测试中模拟它.

谢谢.

解决方法

is there a better way of holding pointers to generic types that don’t require explicit downcasts from the user?

没有.
要么你使用经典的OO,a.k.a.运行时多态性.然后你会遇到基类接口,或者你必须作弊和转发.或者你使用模板,a.k.a.编译时多态.然后,您将在编译时绑定到单个资源类型.

有一些方法可以模糊两者之间的边界(例如,boost :: any),但基本上这些是你必须决定的两个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读