基于数据实例化int模板

时间:2013-03-19 19:07:25

标签: c++ templates

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

2 个答案:

答案 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类。您仍然可以在后台保留类型安全性,但可读性会受到影响。

相关问题