繁体   English   中英

如何在n维数组的可变参数模板中提取参数列表

[英]How to extract the argument list in variadic templates for n-dimensional array

我有一个模板类,其中包含以下规范:

template <typename T, size_t... Dims> class Array;

并说它可以使用如下:

// Define a 2X3X4 array of integers.  Elements are uninitialized.
Array<int, 2, 3, 4> a, b;
Array<short, 2, 3, 4> c;
Array<int, 0> e1; // This line must cause a compile-time error.

我该如何实现此功能? 我想如果我可以提取所有参数列表,那么我可以创建n维数组作为直接递归调用。 我现在该怎么办

您可以创建一个可以执行所需操作的编译时特征:

#include <type_traits>

template <std::size_t... Ts>
struct not_zero {};

template <std::size_t N>
struct not_zero<N> : std::integral_constant<bool, N> {};

template <std::size_t N, std::size_t... Ts>
struct not_zero<N, Ts...> : std::integral_constant<bool, N && not_zero<Ts...>::value> {};

template <typename T, std::size_t... Ts>
struct Array
{
    static_assert(not_zero<Ts...>::value, "Dimension cannot be 0");
};

template struct Array<int, 3>; // OK
template struct Array<int, 3, 2, 1, 0>; // error: static assertion failed: Dimension cannot be 0

在这里看一个演示。

也许这样的事情

namespace mine {

    template<typename T, size_t first, size_t... rest>
    struct multi_array__ {
        enum { dims = sizeof...(rest) };
        static_assert(first,"dimension can not be zero!"); 
        typedef std::array< typename multi_array__<T, rest...>::type, first > type;
    };


    template<typename T, size_t first>
    struct multi_array__<T,first> {
        enum { dims = 1 };
        static_assert(first,"dimension can not be zero!"); 
        typedef std::array<T,first> type;
    };

    template <typename T, std::size_t... ds> 
    using multi_array = typename multi_array__<T, ds ...>::type;

};

你可以像这样使用它

mine::multi_array <int,2,3,4> arr1 = {};
// multi_array<int,2,3,0,4> arr3;  // This fails
mine::multi_array <int,3,4> arr2 = {};

像这样的作业也有效

arr2[0] = arr1[0][0];

Here是一个简单的测试程序。

为它创建一个专门化:

#include <iostream>

template <typename T, std::size_t... Dims>
struct Array {};

template <typename T>
struct Array<T, 0>; // leave as an incomplete type

int main()
{
    Array<int, 3> x; // OK
    Array<int, 0> y; // error: aggregate ‘Array<int, 0u> y’ has incomplete type and cannot be defined
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM