2014-11-12 17 views
6

Voglio creare una classe template con un membro che è un array constexpr. L'array necessita, ovviamente, di un'inizializzazione diversa a seconda del tipo, ma non posso dichiarare l'array senza inizializzarlo. Il problema è che non conosco i valori dell'array fino alla specializzazione del modello.Membro C++ Constexpr del tipo di modello

//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() {} 

Come è possibile inizializzare correttamente A :: a [] in B?

+0

Perché non http://coliru.stacked-crooked.com/a/44a76f94302bd9e2? –

+0

Perché ho alcuni metodi che si basano su quel membro. – biowep

risposta

6

Ogni problema può essere risolto con l'aggiunta di un ulteriore livello di indirezione (tranne troppo indiretto):

// 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

Quindi "Ogni problema può essere risolto aggiungendo o rimuovendo uno strato di riferimento indiretto" –

Problemi correlati