在 C++ 的可变参数模板中获取可变参数 size_t... 参数的总和
Getting the sum of a variadic size_t... argument in a variadic template in C++
我正在尝试在 c++ 中创建一个 n 维数组模板 class(作为 std::array
或 c++ 数组的包装器),它为整个 n 维数组分配一个数组块(To避免使用带有 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;
...
我的问题是我不确定如何获得所有尺寸的产品。
是否可以这样做,如果可以,怎么做?
这是一种方法:
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
的目的是什么,但我认为这就是你打算做的。您可以使用产品生成模板来完成此操作,该模板将 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
注意:我已经为零检测和溢出提供了零功能。无论如何,我希望它能有所帮助。
祝你好运
在 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)
.
我正在尝试在 c++ 中创建一个 n 维数组模板 class(作为 std::array
或 c++ 数组的包装器),它为整个 n 维数组分配一个数组块(To避免使用带有 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;
...
我的问题是我不确定如何获得所有尺寸的产品。
是否可以这样做,如果可以,怎么做?
这是一种方法:
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
的目的是什么,但我认为这就是你打算做的。您可以使用产品生成模板来完成此操作,该模板将 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
注意:我已经为零检测和溢出提供了零功能。无论如何,我希望它能有所帮助。
祝你好运
在 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)
.