这是一个有点做作,但说我有一个类的接口是这样的:在C++中,如何避免使用泛型类型映射的显式向下转换?
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接受一个模板参数来降低内部类型,但是很明显,模板和纯粹的接口不是jive。我目前的选择是隐藏在调用boost :: polymorphic_downcast的CastResource函数中的投射,但我仍然不满意客户需要投射资源的想法。
例如:
CFooResource& fooResource = CastResource<CFooResource&>(container.GetResource());
所以我想我的问题是:是否有持有指针泛型类型不要求用户明确的向下转换更好的办法?我觉得这是一个模板化的方式,但我没有看到它。另外,我制作了这个界面,以便客户可以在需要时轻松地在测试中嘲笑它。
谢谢。
我会说'dynamic_cast'是这里最好的解决方案。你必须认识到函数必须返回不是最派生的类型(这在技术上是不可能的),而是用户期望的类型。否则'NULL'。这正是'dynamic_cast'所做的。将其包装在模板中不会改变1)它仍然是由用户控制的dynamic_cast,2)它不一定是最派生的类型。 – Fozi 2010-08-13 17:42:00