2011-08-25 84 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

這些是模板模板參數,它們是有效的。 –