Ich möchte ein statisches Array in einer Template-Funktion, deren Länge von dem Typ abhängt, auf den die Funktion spezialisiert ist. Mein erster Versuch war:Typabhängige Konstante in Template-Funktion
Rubrik:
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!
// ...
}
Quelldatei:
template<> const size_t Length<double>::len = 2;
template<> const size_t Length<float>::len = 1;
// ...
Allerdings ist g++
dies nicht kompilieren und klagt
error: storage size of ‘vars’ isn’t constant
Also, was genau ist die Problem hier? Ich weiß, dass die Größe eines Array fester Länge eine Konstante sein muss und zur Kompilierungszeit bekannt sein muss, aber das scheint hier der Fall zu sein. Als ich
const size_t len = 2;
void func(){
static double vars[len];
}
schreiben kompiliert es ohne Probleme.
Frage:
Was mit dem Code falsch ist und welche Alternativen gibt es für das gewünschte Verhalten zu erreichen? Ich möchte nicht den Speicher während der Laufzeit verteilen ...
Das Muster der Klassenvorlage der Spezialisierung wird ein metafunction genannt. Definitiv die richtige Lösung hier. – Potatoswatter
Eine explizite Spezialisierung eines Mitglieds muss nicht vorher deklariert werden. Es wird die Member-Deklaration der enthaltenen Klassenvorlage übereinstimmen. – Potatoswatter
@Potatoswatter Ich denke nicht, dass das eine Metafunktion ist. Laut [Boost.MPL] (http://www.boost.org/doc/libs/1_57_0/libs/mpl/doc/refmanual/metafunction.html) ist "A * metafunktion *" eine Klasse oder eine Klassenvorlage, die stellt eine zur Kompilierungszeit aufrufbare Funktion dar. " – Angew