使用Variadic模板的任意维数组

时间:2015-05-10 19:13:41

标签: c++ templates c++11 operator-overloading variadic

如何在C ++ 11中创建一个可以像

一样使用的Array类
Array < int, 2, 3, 4> a, b; 
Array < char, 3, 4> d; 
Array < short, 2> e;

并以类似

的方式访问它
a[2][1][2] = 15; 
d[1][2] ='a';

我还需要将运算符重载为

T &operator[size_t i_1][size_t i_2]...[size_t i_D]; 

不存在。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

最简单的方法是嵌套std::array

#include<array>

template<class T, size_t size, size_t... sizes>
struct ArrayImpl {
    using type = std::array<typename ArrayImpl<T, sizes...>::type, size>;
};

template<class T, size_t size>
struct ArrayImpl<T, size> {
    using type = std::array<T, size>;
};

template<class T, size_t... sizes>
using Array = typename ArrayImpl<T, sizes...>::type;

在此解决方案中,Array<char, 3, 4>std::array<std::array<char, 4>, 3>相同 - 由较小维度的数组组成的数组。

这也说明了如何为多个维度实施operator[]。对象的operator[]需要返回已定义operator[]的对象。在这种情况下,它引用了一个较小维度的数组。

答案 1 :(得分:0)

试试这个:

#include <iostream>

template <typename T, int N1, int... N2>
class Array
{

public:

    Array() {}

    ~Array() {}

    Array<T,N2...>& operator[](int index)
    {
        return data[index];
    }

private:

    Array<T,N2...> data[N1];
};

template<typename T, int N>
class Array<T,N>
{

public:

    Array() {}

    ~Array() {}

    T& operator[](int index)
    {
        return data[index];
    }

private:

    T data[N];
};

int main()
{
    Array < int, 2, 3, 4> a, b;
    Array < char, 3, 4> d;
    Array < short, 2> e;

    a[0][1][2] = 15;
    d[1][2]    = 'a';

    std::cout << "a[0][1][2] = " << a[0][1][2] << std::endl;
    std::cout << "d[1][2]    = " << d[1][2]    << std::endl;

    return 0;
}

你可能也想要进行范围检查,也许还有一些迭代器是花哨的:)