【发布时间】:2017-09-08 17:46:06
【问题描述】:
我正在尝试实现一个资源管理器,它管理特定的加载器并提供一个 load() 函数,该函数重定向到加载器的各个 load() 函数。管理器还进行某种垃圾回收,例如通过调用每个加载器的 freeUnusedResources() 方法来卸载未使用的资源。
问题:
将可变数量的参数转换为显式数量。
我希望每个加载器实现能够提供具有固定数量参数的不同加载函数,而接口/基类 IResourceLoader 可以处理可变数量,这是单个 load( ) ResourceManager 的函数。
比如:
class IResource; //Resources hold only data
class AResource : public IResource {};
class IResourceLoader { //Loader load resources
virtual IResource* load(...);
//or
template<typename ...Args>
IResource* load(Args ...args);
virtual void freeUnusedResources() = 0;
};
class ALoader : public IResourceLoader {
std::vector<IResource*> _loadedResources;
IResource* load(std::string path); //"Implementing" IResourceLoader::load(...)
IResource* load(std::string path, int a, int b); //"Implementing" IResourceLoader::load(...)
void freeUnusedResources() override;
};
class ResourceManager {
//A map of the resource type a loader can load
std::map<std::type_index, IResourceLoader*> _loaders;
template<typename ResourceClass, typename ...LoaderArgs>
IResource* load(LoaderArgs ...args) {
IResourceLoader* loader = _loaders.find(typeid(ResourceClass))->second;
return loader->load(args...);
}
void update() {
for(auto &l: _loaders) {
l.second->freeUnusedResources();
}}
};
现在要加载资源,您只需要:
ResourceManager rm;
//Add some loaders to the manager, then load
rm.load<AResource>("path/to/resource", 10, 20);
这样做的重点是确保没有资源被多次加载,并且没有多个加载器实例。
【问题讨论】:
标签: c++ inheritance c++14 variadic-templates variadic-functions