2013-03-19 64 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(); 

主要問題是您需要一個不透明的類爲主容器。您仍然可以在後臺保留類型安全,但可讀性會受到一些影響。