模板和依赖注入
我有一个类模板
ResourceManager
,它打算使用这样的东西:
ResourceManager<Image>* rm =
ResourceManager<Image>::Instance();
Image* img = rm->acquire("picture.jpg");
rm->release(img);
我想使用依赖注入(将ResourceManager
作为参数传递给应该使用它而不是全局使用的函数),但是鉴于它是一个模板,我不知道如何做到这一点。你有什么建议吗?
我的游戏只是在开发的开始,我已经有四种资源类型(Image
,Font
,Animation
和Sound
),因此为每种类型的资源制作一个带有获取功能的单个ResourceManager
(即非模板)不是一种选择。
编辑:一些澄清。
我正在寻找的不是如何为一种类型的ResourceManager进行依赖注入,而是一次性对所有这些进行依赖注入。
我的GameState
对象在初始化/打开时需要加载资源;他们通过ResourceManagers
这样做。但是,GameStates
可能需要加载任意数量的资源:动画,字体,图像,声音等等&mdash;这是每种ResourceManager
的很多功能参数!你有什么建议我这样做?
没有找到相关结果
已邀请:
4 个回复
很缴
如果函数需要任何类型的资源,那么它也可以 是一个模板本身,如:
它可能需要引用从资源管理器获得的资源,因此无论如何它将需要更多地方的模板参数。 使用多态基类。这意味着你必须定义类似的东西
该函数可以调用基类中定义的任何方法。如果方法在内部依赖于资源类型,则它们将在基础中声明为抽象虚拟(
)并在模板类本身中定义。您还可以使用
来检查您所拥有的
的具体实例。 注意,如果函数需要引用资源,您同样需要一个所有资源的
抽象基类,因此您可以引用任何类型的资源。 选择是在具有模板功能的较快但非常大的代码之间进行权衡(该函数将针对每个特化分别编译)或者使用虚拟方法较慢但较小的代码(调用虚方法较慢,但没有代码重复) )。此外,模板变体编译速度较慢,因为大多数编译器将为使用它的每个目标文件生成代码,而不是在链接时合并相同的副本。
冉案
蹄渭信妥扳
请注意,我遗漏了所有资源管理;在适用的地方使用智能指针等。
室邢
评论者注意:我很清楚资源泄漏,但这不是重点。