我打算在我的gameengine中编写一个ResourceManager类,这样我就可以轻松管理我的图像,音乐,模型等。
类就像:(只是它的工作原理)
class ResoureManager{
std::map<cstring path,T> resources;
public:
<T> get(char path[]);
}
这个想法很简单:将所有内容存储在一个大容器中,然后通过路径返回该对象。我现在的问题是,我必须使用带有模板化容器的类,这样我就可以在将来的时间管理我想要的任何内容。我的主要问题是应该返回对象的::get(char path[])
函数。到目前为止一切顺利,我可以将一些类型用于出口,但是我有什么办法吗?
我正在使用MSVS社区2015。
答案 0 :(得分:0)
您似乎想要返回T
类型的对象(其中类型是“动态”确定的)。这不是模板在C ++中的工作方式。
与C ++程序中的其他内容一样,模板是输入到编译器。它将为实例化为std::map<cstring,T>
种T
创建尽可能多的T
种类。 get
只是您提供的typename的占位符。
您的resource_t
函数似乎属于返回T,无论它是什么。这是一个古老的问题,它从一开始就融入了C ++:继承,虚函数和RTTI。经典地,您定义一个类型 - 让我们称之为resource_t *
- 并从中派生类。每个派生类都实现相同的函数集。您定义地图a以容纳cOpenRecordset()
和 mirabile dictu ,通过指针调用适合其实际(派生)类型的函数。这就是C ++如何实现多态的OO概念。
与您可能熟悉的一些动态语言不同,在C ++中,所有函数名称到对象类型的连接都是在编译时确定的。程序在运行时从未发现某个功能未实现。它在那里,或者它是一个编译错误。
如果你试图充实你提供的草图,你很快就会发现它不能编译,也不能以它所暗示的方式工作。 C ++确实有机制来做你想要的。我能推荐的最好的东西是一本好书,几个小时就可以了解它们。