【问题标题】:Static arrays at compile time in C++C++编译时的静态数组
【发布时间】:2011-08-25 09:35:44
【问题描述】:

我想知道是否有可能使以下answer 更通用,因为数组的类型是模板化的,而不仅仅是无符号的:

我已将整个内容封装在一个结构中,如下所示:

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

【问题讨论】:

  • 在显示编译器错误和代码时,在代码中指出编译器抱怨的确切行(即第 49 行?)通常很有帮助

标签: c++ arrays static metaprogramming


【解决方案1】:

缩进结构会有帮助。问题是您在 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... };

【讨论】:

    【解决方案2】:

    呃...你为什么不直接使用 std::vector 呢?或者如果你想要一个不可恢复的数组,那么在 boost 中使用等效类型?

    【讨论】:

      【解决方案3】:

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

      据我了解,它可以有两种形式:

      1. template &lt;typename... args&gt; : 可变数量的泛型类型参数
      2. template &lt;int... args&gt;:整数(非类型)参数的可变数量

      有关可变参数模板,请参阅this wikipedia article

      【讨论】:

      • 这些是模板模板参数,它们是有效的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2011-02-28
      • 2019-05-03
      • 2012-03-21
      • 2013-09-23
      • 1970-01-01
      相关资源
      最近更新 更多