我试图在c ++中创建一个n维数组模板类(作为std::array
或c ++数组的包装器),为整个n维数组分配一个数组块(为了避免使用n的开销)具有n个索引的数组)。
在执行此操作时,我希望我的模板采用以下格式,其中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;
...
我的问题是我不确定如何获得所有尺寸的产品。
是否可以这样做,如果是这样的话?
答案 0 :(得分:5)
在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)
。
答案 1 :(得分: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;
答案 2 :(得分:1)
我不清楚你对dimensions
的目的是什么,但我认为这是你打算做的。你可以通过一个产品生成模板来实现这一目标,该模板将sizes...
分开并通过乘法将其重新组合在一起:
#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
注意:我没有为零检测和溢出提供零度能力。无论如何,我希望它有所帮助。
祝你好运