0

我使用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
}

?

4

2 回答 2

1

模板在编译时实例化,而不是运行时。因此,您不能拥有基于运行时数据的模板实例化。

于 2013-03-19T19:10:08.467 回答
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();

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

于 2013-03-19T19:18:28.353 回答