C ++模板仅限于基类及其派生类

时间:2012-04-05 13:33:07

标签: c++ class templates derived

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

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

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

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

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

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

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

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

 resourceManager<int> resManInts();

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

我正在考虑使用基类进行模板specilaisation,但是它会返回基类的指针而不是派生类的指针,除非我将它专门用于每个派生类,但是我可能不会有一个模板化的类,但只是为每种类型都有一个资源管理器类。

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

2 个答案:

答案 0 :(得分:1)

是的,可以将模板参数约束到特定类的后代。 see this answer.

或者你可以留下它。无论如何,资源管理器都无法编译,模板参数不满足所需的接口。

答案 1 :(得分:1)

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

只需记录您希望提供给您的所有类型的界面(例如“有一个loadFromFile()方法”)。