得到可变参数size_t的总和.C++ 中可变参数模板中的参数

Getting the sum of a variadic size_t... argument in a variadic template in C++

本文关键字:参数 变参 C++ size      更新时间:2023-10-16

我正在尝试在 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

注意:我对零检测或溢出进行了零提供。无论如何,我希望它有所帮助。

祝你好运