得到可变参数size_t的总和.C++ 中可变参数模板中的参数
Getting the sum of a variadic size_t... argument in a variadic template in C++
我正在尝试在 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;
...
我的问题是我不确定如何获得所有尺寸的产品。
是否有可能这样做,如果可以,如何做到这一点?
在 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)
。
这将是一种方法:
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
注意:我对零检测或溢出进行了零提供。无论如何,我希望它有所帮助。
祝你好运
相关文章:
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 如何使用可变参数模板强制转换每个变体类型
- 关于如何在具有单个参数的变体构造中选择替代方案?
- 调用参数排列不变函数 f(i++, i++)
- 参数归纳与标准::变体
- 模板化回调参数的逆变,如 C# 中的逆变
- 如何在没有参数包的情况下编写变差函数
- 通过具有嵌套类的工厂类获取多个变异类模板参数包
- 获取模板参数的成员变量值列表
- 保留短 lambda 用作函数的中间参数,使用 clang 格式保持不变
- 如何定义变体<x,y,z>提取模板参数的子类型
- 正确对齐内存模板,参数顺序不变
- 递归中不同参数类型的变元模板函数
- 通过函数指针传递给变差函数的参数会更改其值
- 提升预定义为带有参数的全局 lambda 的变体访问者
- 使用可变参数模板参数提升变体访问者
- boost ::变体 - 为什么模板参数比const字符串参数具有更高的优先级
- 将变参数包中的值加载到临时数组中
- 使用额外参数提升变体访客
- 正在将动态数组元素解析为参数?(变音符)