我是一名物理学家,他正在研究需要构建并缓存多个不同类型矩阵的代码。然后,矩阵需要可检索,给定一组唯一指定它们的信息('键')。我试图找到一种灵活的方法。
我目前的做法是将所有关键字捆绑在一起'信息分为单个类:
class FilterKey{
public:
FilterKey(const char type, const X key1, const Y* key2...);
~FilterKey();
bool operator==(const FilterKey& rhs) const;
private:
char type; X mKey1; Y* mpKey2;
}
用户代码将这些传递给名为" MatrixDirectory"的接口类,实例化为全局变量(但不是单例),它存储类型和缓存之间的映射:
//MatrixDirectory.hpp
class MatrixDirectory : private NonCopyable{
public:
void Clear(); //Calls destructors.
void Filter(std::vector<double>& U, const FilterKey& key);
private:
std::map<char types, FilterCache* caches> mpFilterCaches;
};
当MatrixDirectory :: Filter遇到一个新的char类型时,它调用FilterCacheFactory,它根据char从FilterCache构造相应的派生类:
//FilterCacheFactory.cpp
namespace FilterCacheFactory{
FilterCache* MakeFilterCache(char type) {
if '1'==type return new OneDFilterCache();
else if 'S'==type return new S2FilterCache();
else if 'B'==type return new B2FilterCache();
else REQUIRE(False, "Invalid filter type '" << type << "'!");
}
}
并将结果插入到地图中。然后,实际的FilterCaches管理矩阵并在给定FilterKey的情况下执行任何必要的过滤。
这个,或者大约这个,我认为会起作用。但我有点担心必须对FilterKey这么明确。如果MatrixDirectory还可以存储键入不同类型的FilterCaches,那会更好。我想我可以用可变参数模板做到这一点,但我不想直接#include一切。还有另一种方式吗?