在C ++中获取可变参数模板中的可变参数size_t ...参数的总和

时间:2015-04-17 01:39:30

标签: c++ arrays templates variadic-templates

我试图在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;
...

我的问题是我不确定如何获得所有尺寸的产品。

是否可以这样做,如果是这样的话?

3 个答案:

答案 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

注意:我没有为零检测和溢出提供零度能力。无论如何,我希望它有所帮助。

祝你好运