2014-11-12 24 views
6

Chcę utworzyć szablon klasy z członkiem, który jest tablicą constexpr. Tablica wymaga oczywiście innej inicjalizacji w zależności od typu, ale nie mogę zadeklarować tablicy bez jej inicjalizacji. Problem polega na tym, że nie znam wartości tablicy aż do specjalizacji szablonu.C++ członek Constexpr szablonu typu

//A.hpp 
template<typename T> 
class A { 
public: 
    static constexpr T a[]; 
    constexpr A() {}; 
    ~A() {}; 
} 
//B.hpp 
class B: public A<int> { 
public: 
    constexpr B(); 
    ~B(); 
}; 
//B.cpp 
template<> 
constexpr int A<int>::a[]={1,2,3,4,5}; 
B::B() {} 
B::~B() {} 

Jak poprawnie zainicjować A :: a [] w B?

+0

Dlaczego nie http://coliru.stacked-crooked.com/a/44a76f94302bd9e2? –

+0

Ponieważ mam kilka metod, które polegają na tym członkiem. – biowep

Odpowiedz

6

Każdy problem można rozwiązać dodając kolejną warstwę zadnie (z wyjątkiem zbyt wiele zadnie):

// no a[] here. 
template <typename T> struct ConstArray; 

template <> 
struct ConstArray<int> { 
    static constexpr int a[] = {1, 2, 3, 4, 5}; 

    int operator[](int idx) const { return a[idx]; } 
}; 

template <typename T> 
class A { 
    static constexpr ConstArray<T> a; 
}; 
+0

Następnie "Każdy problem można rozwiązać, dodając lub usuwając warstwę pośrednią" –

Powiązane problemy