3

我正在尝试制作一个资源加载器,并希望拥有一个类资源和一个模板类资源管理器。不同类型的资源继承自基础资源类,例如图像、3d 网格等。

我可以拥有任何类型资源的映射,但是我将无法调用特定于派生类的函数。3dMesh 可能有 getVertecies() ,而图像可能有 getWidth() 等。

因此,我将使用模板化的 resourceManager 类。

然后您可以创建资源管理器,例如:

 resourceManager<3dMesh> resMan3DMeshes();
 resourceManager<picture> resManPictures();

资源管理器将返回资源类型的指针,而不是基础资源类。这样您就可以调用特定于每种资源类型的函数。

 pointerToMesh->getVerticies();
 pointerToPicture->getWidth();

但是,使用这种方法,您可以传入任何内容来创建资源管理器。

 resourceManager<int> resManInts();

这很好,除了资源管理器应该能够调用基础资源类的函数。例如,基础资源类将具有用于从文件加载的虚函数,但资源管理器将无法调用这些函数,因为它可以作为模板传递任何内容,以及 int 或字符串或任何没有 loadFromFile( )。

我正在考虑对基类进行模板规范化,但随后它将返回基类的指针而不是派生的指针,除非我为每个派生类专门化它,但我可能还没有模板化类,而是为每种类型提供一个资源管理器类。

那么,有什么方法可以使用模板并具有调用派生类函数的优势,同时仍然可以访问基类的函数?

4

2 回答 2

1

是的,可以将模板参数限制为特定类的后代。看到这个答案。

或者你可以让它保持不变。无论如何,如果模板参数不满足所需的接口,资源管理器将无法编译。

于 2012-04-05T13:42:40.607 回答
1

如果您希望提供给您的所有类型都具有“loadFromFile()”方法,而不仅仅是在模板中使用此方法。如果有人将您作为模板参数“int”提供给您,它将无法编译,据我所知,这是可以的,这个人不应该这样做。

只需记录您希望给定给您的所有类型的接口(例如“有一个 loadFromFile() 方法”)。

于 2012-04-05T13:43:11.307 回答