2016-03-04 78 views
1

我正在二維陣列,包含多個靜態數組(短褲)動態數組:如何將constexpr變量設置爲普通變量?

constexpr unsigned char constColumnMax = columnMax; //wrong 
using column = std::array<short, constColumnMax>; 
column * row = new column[rowMax]; 
row[0][0] = 10; 

哪裏columnMax是具有由先前功能,列定義品牌設置的值的無符號字符up靜態數組,&行數組是一個動態數組列。

這個問題是,我的代碼設置constexpr,constColumnMax等於columnMax是錯誤的。然而,我把它放入std::array<>的變量必須是constexpr類型。

我在這裏死路一條。我能想到的唯一的事情就是使用循環來增加constColumnMax,由於顯而易見的原因,這不起作用。任何幫助你們可以給予不勝感激。

回答

2

先生,您的運氣不好。必須在編譯時知道constexpr的值;如同std::array的大小。請參見http://en.cppreference.com/w/cpp/language/constexpr

+0

所以我別無選擇,只能使用一個向量? – Larrimus

+1

@Larrimus非常。函數也可以是'constexpr',所以如果你可以在編譯時知道函數中的所有數據,那麼你可以使用'std :: array'。但我猜你的情況不可能。 –

+0

嗯...我試圖創建一個數組的向量:'std :: vector >'我收到同樣的錯誤,表示'columnMax'必須有一個常量值。 – Larrimus

1

constexpr的承諾是它可以在編譯時進行評估。 數組的實現接近於像type name[size]這樣的實現,其中大小必須是常量表達式。

Here是constexpr解釋後的一般想法。 Here是從C++ 11到C++ 14的一些變化記錄。

這裏有兩個選擇:

  • 使用一個載體,所以你可以成長的陣列自然
  • 移動負責了模板

下面層次是一些片段,以充實想法多一點:

#include <array> 
#include <vector> 

template<typename T, size_t R, size_t C> 
using Array2D = std::array<std::array<T, R>, C>; 

template<typename T, size_t R, size_t C> 
void templatedFunction() 
{ 
    Array2D<short, R, C> arr; 
    arr[0][0] = 0; 
} 

template<typename T> 
using Dynamic2D = std::vector<std::vector<T, std::allocator<T>>, std::allocator<T>>; 

template<typename T> 
void dynamicFunction(size_t R, size_t C) 
{ 
    Dynamic2D<T> arr; 
    arr.reserve(R); 
    for (size_t n = 0; n < R; ++n) 
    { 
     arr.emplace_back(C); 
     arr[n].emplace_back(0); 
    } 
} 

int main() 
{ 
    templatedFunction<short, 4, 5>(); 
    dynamicFunction<short>(4, 5); 
}