2015-04-02 27 views
6

我試圖通過引用傳遞未知數量的維度(等級)的數組。基本上,我想要做這樣的事情(不編譯)通過引用傳遞未知等級的數組

template <typename T, int... dims> 
void f(T (&arr)[dims]...) // not working 
{ 
    // would like to modify the elements of `arr` here, according to some rule 
} 

int main() 
{ 
    int arr[2][3][4]; // rank 3 
    f(arr); 
} 

有沒有辦法實現這個?特別是,它是否有可能使用可變參數模板方法?

我可以做的通用template<typename T> f(T& arr),但在這種情況下,我怎麼能夠恢復大小而不顯式傳遞它們? (即使使用可變模板方法,我也不確定如何恢復包中的單個元素......而沒有某種遞歸摺疊)。

特別是,我正在尋找一種根據某些規則初始化未知等級數組的簡單方法。

回答

3

您只需傳遞對T類型數組的引用即可。然後T可以是另一個數組等等。不需要複雜的語法。所以,你的代碼看起來就像這樣:

template <typename T, int sz> 
void f(T (&arr)[sz]) // working 
{ 
    std::rank<T[sz]>::value; //evaluates to array rank 
} 

int main() 
{ 
    int arr[2][3][4]; // rank 3 
    f(arr); 
} 

然後,您可以通過使用std::rank獲取數組等級。

你可以通過使用std::remove_extent和模板遞歸來獲得子數組大小。

生活example

+0

謝謝,但我認爲你得到了'std :: rank :: value'的排名,不是嗎?問題是'std :: cout << std :: rank :: value << std :: endl;'吐出'0'。 – vsoftco 2015-04-02 18:02:47

+0

是的 - 你說得對 - 對不起。必須使用'decltype'。 – AnArrayOfFunctions 2015-04-02 18:05:31

+0

和'value',而不是'value_type'。但即使在這種情況下,似乎'std :: rank'認爲通用類型的非數組類型正在傳遞。嘗試'std :: cout << typeid(arr).name();'給出正確的類型,3-D數組,但由於某種原因'std :: rank'不起作用。嘗試顯示排名。 – vsoftco 2015-04-02 18:07:11