2013-03-19 99 views
0

我使用Eigen作为线性代数包。在那里,他们有固定的尺寸矩阵类型,定义是这样的:becasue我只用向量和方阵基于数据实例化int模板

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

如果您的软件支持动态调整大小,但编程接口是静态的,那么您可以尝试使用“即时”代码。您在运行时创建动态共享对象,然后加载它。 – jxh 2013-03-19 19:12:23

回答

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(); 

主要问题是您需要一个不透明的类为主容器。您仍然可以在后台保留类型安全,但可读性会受到一些影响。