Desidero un array statico in una funzione basata su modelli la cui lunghezza dipende dal tipo con cui la funzione è specializzata. Il mio primo tentativo è stato:Costante dipendente dal tipo nella funzione template
intestazione: file di
template<typename T>
struct Length {
const static size_t len;
};
template<typename T>
void func(){
static T vars[Length<T>::len]; // len not const. according to compiler!
// ...
}
Fonte:
template<> const size_t Length<double>::len = 2;
template<> const size_t Length<float>::len = 1;
// ...
Tuttavia, g++
non compilare questo e si lamenta
error: storage size of ‘vars’ isn’t constant
Quindi, qual è esattamente la problema qui? So che la dimensione di un array a lunghezza fissa deve essere costante e conosciuta in fase di compilazione, ma sembra che sia il caso qui. Quando scrivo
const size_t len = 2;
void func(){
static double vars[len];
}
compila senza problemi.
Domanda:
Cosa c'è di sbagliato con il codice e quali alternative ci sono per ottenere il comportamento desiderato? Non desidero allocare la memoria durante l'esecuzione ...
Il modello di specializzazione del modello di classe è chiamato metafunction. Sicuramente la soluzione giusta qui. – Potatoswatter
Non è necessario che una specializzazione esplicita di un membro sia dichiarata in precedenza. Corrisponde alla dichiarazione membro del relativo modello di classe contenente. – Potatoswatter
@Potatoswatter Non penso che sia una metafunzione. Come per [Boost.MPL] (http://www.boost.org/doc/libs/1_57_0/libs/mpl/doc/refmanual/metafunction.html), "metafunction * * è una classe o un modello di classe che rappresenta una funzione invocabile in fase di compilazione. " – Angew