在C++中获取variadic模板中可变参数size_t ...参数的总和

问题描述:

我想在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

这将是做到这一点的一种方法:

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; 

我对你的的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

在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)