2015-04-17 37 views
3

我想在C++中爲C++創建一個n維數組模板類(作爲std::array或C++數組的數組)整個n維數組(爲了避免使用具有n個索引的n個數組的開銷)。在C++中獲取variadic模板中可變參數size_t ...參數的總和

爲此,我希望我的模板採用以下格式,其中sizes代表每個維度的大小。

template <class Type, size_t... sizes> 
class array_dimensional{ 
private: 
    std::array<Type, /*here is the problem, how do 
     I get the product of all the sizes?*/> allocated_array; 
... 

我的問題是,我不知道如何獲得所有尺寸的產品。

有沒有可能做到這一點,如果是的話如何?

+1

寫一個遞歸乘法函數 – Hurkyl

回答

3

這將是做到這一點的一種方法:

template<size_t size, size_t... sizes> 
struct size_product 
{ 
    static const size_t value = size * size_product<sizes...>::value; 
}; 

template<size_t size> 
struct size_product<size> 
{ 
    static const size_t value = size; 
}; 

... 

std::array<Type, size_product<sizes...>::value> allocated_array; 
1

我對你的的dimensions目的還不清楚,但我認爲這是你打算做什麼。

#include <iostream> 
#include <array> 

template<size_t N, size_t... M> 
struct product_of 
{ 
    static constexpr size_t size = N * product_of<M...>::size; 
}; 

template<size_t N> 
struct product_of<N> 
{ 
    static constexpr size_t size = N; 
}; 

template <class Type, size_t... sizes> 
struct array_dimensional 
{ 
    static std::array<size_t, sizeof...(sizes)> dims; 
    std::array<Type, product_of<sizes...>::size> ar; 
}; 

template<class Type, size_t... sizes> 
std::array<size_t, sizeof...(sizes)> array_dimensional<Type,sizes...>::dims{sizes...}; 

int main() 
{ 
    array_dimensional<int, 2,3,4,5> ar; 

    std::cout << ar.dims.size() << '\n'; 
    for (auto x : ar.dims) 
     std::cout << x << ' '; 
    std::cout << '\n'; 
    std::cout << ar.ar.size() << '\n'; 
} 

輸出

4 
2 3 4 5 
120 

注意:您可以與通過乘法撕裂開sizes...滴滴其重新組合的產物生成模板做到這一點我做了零個啓示零檢測也不溢出。無論如何,我希望它有幫助。

最佳運氣

+0

@Hurkyl肯定...更新(我假設你的意思是一個'std :: array')。 – WhozCraig

+0

'dims'仍然可以'constexpr'作爲'std :: array',afaik。 – Hurkyl

4

在C++ 14,一個constexpr功能可以是更容易閱讀:

template<size_t... S> 
constexpr size_t multiply() { 
    size_t result = 1; 
    for(auto s : { S... }) result *= s; 
    return result; 
} 

在C++ 17,只需使用一個倍的表達:(... * sizes)