c++编译时的静态数组

Static arrays at compile time in C++

本文关键字:静态 数组 编译 c++      更新时间:2023-10-16

我想知道是否有可能使以下答案更通用,在某种意义上,数组的类型被模板化,而不仅仅是无符号的:

我把整个东西括在一个结构体中,像这样:

template<typename ArrayType>
struct Array
{
template<ArrayType... args> struct ArrayHolder {
    static const ArrayType data[sizeof...(args)];
};
template<ArrayType... args> 
const ArrayType ArrayHolder<args...>::data[sizeof...(args)] = { args... };
template<size_t N, template<size_t> class F, ArrayType... args> 
struct generate_array_impl {
    typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};
template<template<size_t> class F, ArrayType... args> 
struct generate_array_impl<0, F, args...> {
    typedef ArrayHolder<F<0>::value, args...> result;
};
template<size_t N, template<size_t> class F> 
struct generate_array {
    typedef typename generate_array_impl<N-1, F>::result result;
};
};

,但我得到以下错误:

c++-4.6 -std=c++0x -o test test.cpp
test.cpp:49:17: error: specializing member ‘Array<ArrayType>::ArrayHolder<args>::data’ requires ‘template<>’ syntax

缩进结构体会有帮助。问题是在Array结构体内部定义数据静态成员变量。但它应该在命名空间范围内:

template<typename ArrayType>
struct Array
{
    template<ArrayType... args> struct ArrayHolder {
        static const ArrayType data[sizeof...(args)];
    };
    template<size_t N, template<size_t> class F, ArrayType... args> 
        struct generate_array_impl {
            typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
        };
    template<template<size_t> class F, ArrayType... args> 
        struct generate_array_impl<0, F, args...> {
            typedef ArrayHolder<F<0>::value, args...> result;
        };
    template<size_t N, template<size_t> class F> 
        struct generate_array {
            typedef typename generate_array_impl<N-1, F>::result result;
        };
};
template<typename ArrayType> template<ArrayType... args> 
        const ArrayType Array<ArrayType>::ArrayHolder<args...>::data[sizeof...(args)] = { args... };

呃…为什么不直接使用std::vector呢?或者,如果您想要一个不稳定的数组,那么使用boost中的等效类型?

我不认为像'template '这样的表达式是c++ 11可变模板的有效用法。

根据我的理解,它可以有两种形式:

  1. template <typename... args>:泛型参数的可变数目
  2. template <int... args>:整型(非类型)参数的可变数量

参考维基百科的可变模板文章