2014-02-11 61 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中工作,我会这样写。 –

相关问题