C++模板使用多维数组

3
在C++中是否可以这样写:
template <typename T, size_t dim, size_t len>
using A = /* something */;

这将使这两行代码等效:

/* 1 */ A<int, 3, 5> a;   A<char, 5, 3> c;

/* 2 */ int a[5][5][5];   char c[3][3][3][3][3];

?


1
请更详细地解释“等效”(equivalent)的含义。可以展示一些你想要工作的代码行以及你想要它们产生的效果。 - Yunnosch
1个回答

5

这是可能的吗? 是的,您可以在编译时进行任意复杂的计算,因此肯定有解决方案。

最简单的方法就是使用模板递归,像这样:

template <class T, size_t dim, size_t len>
struct A_helper {
    using type = typename A_helper<T, dim - 1, len>::type[len];
};

template <class T, size_t len>
struct A_helper<T, 0, len> {
    using type = T;
};

template <class T, size_t dim, size_t len>
using A = typename A_helper<T, dim, len>::type;

在Coliru上查看:http://coliru.stacked-crooked.com/a/bfc9052b30bce553

我可以直接使用 template<typename T, size_t dim, size_t len> using A = A<T, dim-1, len>[len] 吗? - iBug
需要一个辅助类吗? - iBug
2
@iBug 你需要一些可以部分特化的东西来提供基本情况,而别名模板无法(部分或全部)特化。 - Brian Bi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接