Это немного надумано, но, скажем, у меня есть интерфейс класса, подобный этому:
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());
Итак, я предполагаю, что мой вопрос: есть ли лучший способ удерживать указатели на универсальные типы, которые не требуют явных откликов от пользователя?Я чувствую, что есть шаблонный способ сделать это, но я этого не вижу.Кроме того, я сделал этот интерфейс, чтобы клиенты могли легко смоделировать его в своих тестах, если это необходимо.
Спасибо.