lhu*_*ous 3 c++ templates interface
这有点人为,但我说我有这样的类接口:
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;
};
Run Code Online (Sandbox Code Playgroud)
我有一个这个类的实现,它包含一个IResource类型的字符串映射.如果我要像这样添加我自己的资源:
container.AddResource("foo", std:auto_ptr<IResource>( new CFooResource);
Run Code Online (Sandbox Code Playgroud)
然后检索资源引用
CFooResource& fooResource = container.GetResource(); // error
Run Code Online (Sandbox Code Playgroud)
这不会编译因为我需要将IResource转发到CFooResource.我想通过让GetResource获取一个模板参数来隐藏它,这个参数在内部向下转换类型,但很明显,模板和纯接口不会生成.我目前的替代方法是在CastResource函数中隐藏转换,该函数调用boost :: polymorphic_downcast,但我仍然不满意客户端需要转换资源的想法.
例如:
CFooResource& fooResource = CastResource<CFooResource&>(container.GetResource());
Run Code Online (Sandbox Code Playgroud)
所以我想我的问题是:是否有更好的方法来保存指向通用类型的指针,这些类型不需要用户进行明确的向下转换?我觉得有一种模板化的做法,但我没有看到它.此外,我创建了这个界面,以便客户可以在需要时轻松地在测试中模拟它.
谢谢.
是否有更好的方法来保存指向不需要用户显式向下转换的泛型类型的指针?
不.
要么你使用经典的OO,也就是运行时多态.然后你会遇到基类接口,或者你必须作弊和转发.或者你使用模板,也就是编译时多态.然后,您将在编译时绑定到单个资源类型.
有一些方法可以模糊两者之间的边界(boost::any例如),但基本上这些是你必须决定的两个.