2015-12-25 6 views
10

Ich möchte einige Variablen schreiben, wieWie schreibedefdef ein std :: Array mit einer nicht angegebenen Größe?

std::array<double, array_num> a; 

wo array_num ein const int ist die Länge des Arrays darstellt. Aber es ist lang und ich möchte einen Alias ​​dafür erstellen:

typedef std::array<double, array_num> my_array; 

Ist es richtig? Wie kann ich my_array wie my_array<3> verwenden?

+0

Ein 'std :: array' hat einen Dimensionsausdruck * constant *. Es kann keine Variable sein. Wenn Sie wollen, dass es eine Variable ist, wollen Sie 'std :: vector' oder vielleicht ein zukünftiges' std :: dynarray' (in einem zukünftigen Standard für C++) –

Antwort

27

Was Sie brauchen, ist ein alias template:

template <size_t S> 
using my_array = std::array<double, S>; 

Sie nicht direkt eine typedef Vorlage machen können, finden Sie this post.

size_t ist die Art des zweiten Vorlagenparameter std::array nimmt, nicht int.

Nun, da Sie über using wissen, sollten Sie das verwenden. Es kann alles tun, was typedef tut, plus dies. Auch lesen Sie es von links nach rechts mit einem schönen = Zeichen als Trennzeichen, im Gegensatz zu typedef, die Ihre Augen manchmal verletzen könnte.


Lassen Sie mich zwei weitere Beispiele für den Einsatz hinzu:

template <typename T> 
using dozen = std::array<T, 12>; 

Und wenn Sie einen Alias ​​für std::array, wie es ist, schaffen wollte, dann würden Sie seine Vorlage Unterschrift nachahmen müssen:

template <typename T, size_t S> 
using my_array = std::array<T, S>; 

- denn dies ist nicht erlaubt:

using my_array = std::array; 
+2

Vielen Dank! 'using' ist wirklich besser und so ist' size_t'. – yikouniao

+0

'size_t' ist der Typ des zweiten Template-Parameters' std :: array' und wird für die Größen aller Standardcontainer verwendet. Auf x86-64 hat "int" 4B, während "size_t" 8B hat. Du willst einfach nicht "int" herumlaufen. Es ist nicht einmal "unsigniert". – LogicStuff

+0

@yikouniao Hinzugefügt einige zusätzliche Informationen, und auch das Template-Argument kann keine Variable sein, wie Sie es in Ihrer Frage formuliert haben. – LogicStuff

Verwandte Themen