【问题标题】:C++ Template limited to a base class and its derived classesC++ 模板仅限于基类及其派生类
【发布时间】:2012-04-05 13:33:06
【问题描述】:

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

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

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

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

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

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

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

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

 resourceManager<int> resManInts();

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

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

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

【问题讨论】:

  • 如果您的模板调用类成员,那么您将无法在没有这些成员的类型上实例化模板。它不会编译。
  • 我在解析您的问题时遇到了问题。你能排除一些问题领域语言吗?

标签: c++ class templates derived


【解决方案1】:

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

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

【讨论】:

  • 好的,这似乎是最简单的解决方案。谢谢 :) 如果我有一个虚拟基类资源,它实现了我希望资源管理器调用的所有功能,然后确保所有派生类都覆盖了虚拟函数,那么这些派生类中的任何一个都可以与资源管理器一起使用没有编译错误。
  • @jtedit 如果在编译时一切都是已知的,则不需要具有虚拟方法的基类。在需要的地方使用虚拟方法(当前或未来的增强)。
【解决方案2】:

是的,可以将模板参数限制为特定类的后代。 see this answer.

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

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2018-04-22
    • 2018-12-14
    • 2017-01-13
    • 1970-01-01
    相关资源
    最近更新 更多