Was Sie wirklich wollen, so etwas wie die vorgeschlagene std :: array_ref (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3334.html), die jede Größe akzeptiert und enthält nur einen Zeiger Bereich (oder ein Zeiger und zählen, je nachdem, wie es implementiert ist), nicht Vorlage Bloat für jeden möglichen Container-Typ, Heap allozierten Container oder Paare von Iteratoren an jedem Aufrufpunkt.
Eine andere Option, die Leute vergessen, ist jedoch std :: initializer_list, die effektiv array_ref ist, eine leichte zusammenhängende homogene Ansicht von Elementen. Obwohl sie für Konstruktoren gedacht sind (wobei der Name "Initialisierer" am sinnvollsten ist), können sie auch von generischen Funktionen konsumiert werden.Beachten Sie, dass der Inhalt nicht kopiert wird, wenn er übergeben wird, nur ein Zeigerbereich, was bedeutet, dass Sie initializer_list nicht als Referenz übergeben müssen (und sollten).
Damit können Sie die Reihe von Zahlen direkt in dem Funktionsaufruf übergeben:
void myFunc(std::initializer_list<int> p)
{
cout << "array contains " << p.size() << "elements";
}
myFunc({1, 2, 3, 4, 5});
myFunc({6, 7, 8});
oder über eine Zwischengröße:
std::initializer_list<int> a = {1, 2, 3, 4, 5};
std::initializer_list<int> b = {6, 7, 8};
auto c = {1, 2, 3, 4, 5};
auto d = {6, 7, 8};
myFunc(a);
myFunc(b);
myFunc(c);
myFunc(d);
Oder auch, wie es scheint, von der festen Größe angepasst std :: array unter Verwendung einer Konstruktorüberladung, die ein Anfangs-/Endpaar verwendet.
Obwohl ich diese Konstruktor Überladung nicht auf cppreference.com, noch in N4166 aufgelistet. Diese Überladung ist möglicherweise nicht Standard und wird nur in Dinkumwares STL (von Visual Studio 2015 verwendet) gefunden. Außerdem gibt es keine impliziten Konvertierungen von array/vector, so dass Sie letztendlich trotzdem eine Zwischen-Helfer-Template-Funktion schreiben müssen (oder mehr Code schreiben, als wenn Sie einfach zwei Bereiche übergeben würden), was zu schlecht ist. Idealerweise würde std :: array eine Operator-Methode unterstützen, die zu initializer_list oder array_ref hochgestuft wird, die im Standard übernommen werden.
Übergeben Sie einen Bereich anstelle eines Containers, wenn Sie den * Container * (aber nur die Elemente, wenn überhaupt) nicht ändern möchten. – dyp
BTW. Die '' ist Teil des * Typs *. Das bedeutet a) Ihre ersten beiden Zeilen enthalten Tippfehler und b) Sie können nicht nur das * template * 'std :: array' als Funktionsparameter verwenden (da es sich nicht um einen Typ, sondern um eine Vorlage für Typen handelt). –
dyp
@dyp Was ist der Unterschied zwischen dem Ändern eines 'std :: array' und dem Ändern der Elemente eines' std :: array'? – aschepler