c++ - 用模板初始化的 N 维 std::array

标签 c++ arrays c++11

考虑以下代码:

#include <iostream>
#include <array>

template <typename, int, int...> struct NArray;

template <typename T, int NUM_DIMENSIONS, int N>
struct NArray<T, NUM_DIMENSIONS, N> {
    using type = std::array<T, N>;
};

template <typename T, int NUM_DIMENSIONS, int FIRST, int... REST>
struct NArray<T, NUM_DIMENSIONS, FIRST, REST...> {
    using type = std::array<typename NArray<T, NUM_DIMENSIONS, REST...>::type, FIRST>;
};

template <typename T, int NUM_DIMENSIONS, int... N>
typename NArray<T, NUM_DIMENSIONS, N...>::type NDimensionalArray() {
    typename NArray<T, NUM_DIMENSIONS, N...>::type nArray;
    return nArray;
}

int main() {
    const auto nArray = NDimensionalArray<int,4, 2,4,5,3>();
}

我想要的是能够用更多的 int 值扩展 NDimensionalArray 的模板包,以便将某些值初始化为某个指定的固定值。例如,

auto a = NDimensionalArray<bool,4, 2,4,5,3, 1,2,3,2, 0,0,2,1>(true);

将返回一个 2x4x5x3 4 维 std::array,其中 a[1][2][3][2] = true 且 a[0][0][2][1] = true,其他所有元素错误。但我在使用多个模板包时遇到问题,似乎无法正常工作。任何帮助,将不胜感激。谢谢。

最佳答案

这是一个可行的解决方案。如果有人可以对其进行改进,我会非常有兴趣看到它,因为我不知道还有什么其他方法可以做到这一点。

#include <iostream>
#include <array>
#include <cstring>

template <int... > struct seq {};

template <typename, int...> struct NArray;

template <typename T, int N>
struct NArray<T, N> {
    using type = std::array<T, N>;
};

template <typename T, int FIRST, int... REST>
struct NArray<T, FIRST, REST...> {
    using type = std::array<typename NArray<T, REST...>::type, FIRST>;
};

template <typename T, typename Dim>
struct make_narray;

template <typename T, int... N>
struct make_narray<T, seq<N...>>
{
    using type = typename NArray<T, N...>::type;
};

template <typename T>
T& get(T& val, seq<>)
{
    return val;
}

template <typename NA, int E0, int... Es>
auto get(NA& arr, seq<E0, Es...>)
-> decltype(get(arr[E0], seq<Es...>{}))
{
    return get(arr[E0], seq<Es...>{});
}

template <typename T, typename Dim, typename... Elems>
typename make_narray<T, Dim>::type
NDimensionalArray(T val)
{
    typename make_narray<T, Dim>::type narray{};
    auto _{get(narray, Elems{}) = val ...};  // Quick initialization step!
    return narray;
}

int main() {
    auto a = NDimensionalArray<bool, seq<2, 4, 5, 3>, seq<1, 2, 3, 2>, seq<0, 0, 2, 1>>(true);

    std::cout << std::boolalpha;
    std::cout << a[0][0][0][0] << std::endl; // prints false
    std::cout << a[1][2][3][2] << std::endl; // prints true
    std::cout << a[0][0][2][1] << std::endl; // prints true
}

关于c++ - 用模板初始化的 N 维 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26683151/

相关文章:

c++ - 为什么 cin.get(char, int) 不会溢出?

c++ - 套接字未从客户端接收

c - MPI_Scatter and Gather - 二维数组,不均匀 block

javascript - React 渲染数组键和对象

c++ - 初始化枚举类类型的二维 std::array (C++11)

c++ - constexpr 和纯函数之间的关系

c++ - std::unique_ptr 作为参数的正确复制语义

c++ - 如何在 Eigen 中有效地使用逆和行列式?

arrays - 给定排序的整数数组,写一个基于分治法的算法 A[i]=i

c++ - 在范围之间创建一个随机偶数