我不喜欢这样调用 3 维 vector :
std::vector<std::vector<std::vector<value_type>>>
更不用说我是否想要 4 维甚至更高维了。
是否有任何方法可以使用模板元编程或某种技术来声明具有更高可读性的高维 vector ?
例如,能够像这样声明一个高维 vector (仅是一个示例):
t_vector<5, {10, 2, 2, 2, 2}, int> a;
得到容量为[10][2][2][2][2]的a。
可以做这样的事情吗? 或者为什么不呢?
最佳答案
从您的示例来看,您需要的是 std::array
而不是 std::vector
,因为后者没有固定长度。
您可以只使用递归来专门化模板:
template<class T, size_t... Ns> struct foo;
template<class T, size_t N0, size_t... Ns>
struct foo<T, N0, Ns...> {
using type = std::array<typename foo<T, Ns...>::type, N0>;
};
template<class T>
struct foo<T> {
using type = T;
};
template<class T, size_t... Ns>
using multiarray_t = typename foo<T, Ns...>::type;
static_assert(
std::is_same_v<
multiarray_t<int, 3, 2, 5>,
std::array<std::array<std::array<int, 5>, 2>, 3>
>
);
编辑:
如果你想初始化一个给定大小的std::vector
,类似的方法仍然适用:
template<class T, size_t... Ns> struct vec_builder;
template<class T, size_t N0, size_t... Ns>
struct vec_builder<T, N0, Ns...> {
using type = std::vector<
typename vec_builder<T, Ns...>::type>;
static type build() {
return type(N0, vec_builder<T, Ns...>::build());
}
};
template<class T>
struct vec_builder<T> {
using type = T;
static type build() { return {}; }
};
int main() {
auto vec = vec_builder<int, 3, 2, 5>::build();
static_assert(
std::is_same_v<
decltype(vec),std::vector<std::vector<std::vector<int>>>
>);
assert(vec.size() == 3);
assert(vec[0].size() == 2);
assert(vec[1][0].size() == 5);
}
关于c++ - 声明高维 vector 的更简洁的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52984653/