我使用Eigen作为线性代数包。他们有固定大小的矩阵类型,定义如下:
template<class TNumber, size_t N, size_t M>
class Matrix
{...}
因此我只使用向量和方形矩阵,我的大多数类最终都是类似的模板:
template<size_t K>
class MyClass {...}
维度K实际上取决于从文件加载的数据。有没有合理的方法来使用动态大小K实例化这些模板,或者我必须有一个switch语句:
switch(dim) {
case 1: MyClass<1>...
case 2: MyClass<2>...
default: //too much data
}
答案 0 :(得分:1)
模板在编译时实例化,而不是运行时。因此,您无法基于运行时数据进行模板实例化。
答案 1 :(得分:0)
如果您有维度数量的上限,则可以创建代理类以将维度映射到索引并改为使用索引。这不是一个很好的解决方案,但可能会有效。
class Proxy{
protected:
OpaqueAllocator *allocators[10];
public:
Proxy(){
allocators[0] = new SpecializedAllocator<0>();
allocators[1] = new SpecializedAllocator<1>();
allocators[...] = new SpecializedAllocator<...>();
allocators[9] = new SpecializedAllocator<9>();
}
static OpaqueAllocator* getAllocator(const size_t index){ return allocators[index]; }
};
// usage:
int test = 2;
// allocate a two dimensional array:
Container *c = Proxy::getAllocator(test)->allocate();
主要问题是你需要一个主容器的opaque类。您仍然可以在后台保留类型安全性,但可读性会受到影响。