2011-08-25 79 views
2

我在想,如果有可能作出以下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 
+1

当显示编译器错误和代码,它通常是相当有帮助的代码点的确切行的编译器抱怨(也就是说,它是线49?) –

回答

8

它帮助,如果您缩进结构。问题是你正在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

的伟大工程,谢谢! –

-2

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

-2

我不认为像“模板”表达的是C++ 11个可变参数模板的有效使用。

它可以是两种形式作为我的理解:

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

参见以this wikipedia article为可变模板。

+3

这些是模板模板参数,它们是有效的。 –