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