c++ - 声明高维 vector 的更简洁的方法

标签 c++ c++11 templates template-meta-programming

我不喜欢这样调用 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/

相关文章:

c++ - 如何从 C++ 中的依赖类型获取它所依赖的类型

c++ - 为什么即使其中一个被继承为虚拟,基类也会被继承两次?

c++ - 为什么在函数体内使用 `typename`

c++ - C++中的DB(MYSQL)命令查询

C++ 可变参数模板异常示例

c++11 - 在 unique_ptr 上 GMOCK EXPECT_CALL

c++ - std::forward 与 std::move 的用法

c++ - 调用将模板指针指向函数的模板函数

c++ - 在 linux 中使用 fork() 时使用指针的引用值

c++ - c++ 中的自定义(非异常)错误处理策略