2014-02-11 90 views
0

我有一個模板類,它看起來是這樣的:我可以統一初始化模板類的靜態常量成員嗎?

template <typename T> 
class foo 
{ 
    static const T arr[16]; 
}; 

foo<T>::arr內容是對所有類型T,我打算使用數字相同。例如,我將通過把線在源文件中,如下所示初始化它T = floatT = double

float foo<float>::arr[16] = {1, 2, 3, 4, ...}; 
double foo<double>::arr[16] = {1, 2, 3, 4, ...}; 

有沒有辦法,我可以不必重複自己,並列舉所有的在一個地方初始化此辦法T可以採取的類型?請注意,由於每個數組元素的類型爲T,因此我無法使用從包含靜態數組的非模板基類派生foo<T>的技巧。

+0

您可以使用'define'。 –

回答

2

你有什麼試過?這適用於我:

#include <iostream> 
using namespace std; 

template<typename T> 
struct Foo { 
    static T const arr[16]; 
}; 

template<typename T> 
T const Foo<T>::arr[16] = {1,2,3,4}; 

int main() { 
    for (float const *f = Foo<float>::arr; f != Foo<float>::arr+16; ++f) { 
     cout << *f << " "; 
    } 
    cout << endl; 
    for (double const *d = Foo<double>::arr; d != Foo<double>::arr+16; ++d) { 
     cout << *d << " "; 
    } 
    cout << endl; 
} 
+0

我試圖避免在初始化它在一個頭文件中時可能發生的靜態變量的多個實例的問題([在這裏描述,例如](http://stackoverflow.com/questions/185844/initializing-私人靜態成員))。我認爲如果'foo '的聲明位於多個編譯單元包含的頭文件中,則此方法會觸發該問題。 –

+0

爲什麼不用'for(auto d = std :: begin(Foo :: arr); d!= std :: end(Foo :: arr); ++ d)'......或者爲什麼不用'for (auto const&i:Foo :: arr)' – Nawaz

+0

@Nawaz,我堅持使用C++ 03,因爲問題沒有被標記爲C++ 11。如果我在C++ 11中工作,我會這樣寫。 –

相關問題