【发布时间】:2018-09-13 07:57:05
【问题描述】:
看到 std::array 的好处后,我试图创建一个支持多维的类。
我最初的实验使用嵌套的 std::array。我选择不使用这种方法部分是因为编写类型的方式很丑。
即:std::array<std::array<std::array<...>, >, >
除了初始化之外,新类大部分都在工作。我还没有决定是最好使用继承还是包含。选择可能取决于我是否可以让初始化工作。
如何编译最后两行:
// multi-dimensional array based on std::array
#include <array>
template <class T, int s, int... r>
class arraynd_a : public std::array<arraynd_a<T, r...>, s>
{
public:
};
template <class T, int s>
class arraynd_a<T, s> : public std::array<T, s>
{
public:
};
template <class T, int s, int... r>
class arraynd_b
{
public:
std::array<arraynd_b<T, r...>, s> arr;
};
template <class T, int s>
class arraynd_b<T, s>
{
public:
std::array<T, s> arr;
};
void test()
{
constexpr std::array<std::array<int, 2>, 3> a1 = { { { 0, 1 }, { 1, 0 }, { 2, 4 } } };
/*constexpr*/ arraynd_a<int, 3, 2> a2a;
/*constexpr*/ arraynd_b<int, 3, 2> a2b;
#if 0
/*constexpr*/ arraynd_a<int, 3, 2> a3a = { { { 0, 1 }, { 1, 0 }, { 2, 4 } } };
#endif
#if 0
/*constexpr*/ arraynd_b<int, 3, 2> a3b = { { { 0, 1 }, { 1, 0 }, { 2, 4 } } };
#endif
}
【问题讨论】:
-
如果您担心嵌套数组的类型看起来很难看,请考虑使用 typedef 或 using 声明。
-
访问数组为:
a2b.arr = {...}完成了这项工作,但我不知道如何通过聚合初始化来做到这一点 -
我建议您查看一个库,例如 eigen 或 amadrillo。你不必重新发明它。 eigen.tuxfamily.org/dox-devel/unsupported/…
标签: c++