(Hinweis: Bei dieser Frage geht es darum, die Anzahl der Elemente nicht angeben zu müssen und dennoch zu ermöglichen, dass verschachtelte Typen direkt initialisiert werden.) In
dieser Frage werden die Verwendungszwecke für ein C-Array wie erläutert int arr[20];
. In seiner Antwort zeigt @James Kanze eine der letzten Hochburgen von C-Arrays, seine einzigartigen Initialisierungseigenschaften:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Wir müssen die Anzahl der Elemente nicht angeben, hurra! Durchlaufen Sie es jetzt mit den C ++ 11-Funktionen std::begin
und std::end
von <iterator>
( oder Ihren eigenen Varianten ), und Sie müssen nicht einmal an seine Größe denken.
Gibt es nun (möglicherweise TMP) Möglichkeiten, dasselbe zu erreichen std::array
? Die Verwendung von Makros erlaubt es, es schöner aussehen zu lassen. :) :)
??? std_array = { "here", "be", "elements" };
Bearbeiten : Zwischenversion, zusammengestellt aus verschiedenen Antworten, sieht folgendermaßen aus:
#include <array>
#include <utility>
template<class T, class... Tail, class Elem = typename std::decay<T>::type>
std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values)
{
return { std::forward<T>(head), std::forward<Tail>(values)... };
}
// in code
auto std_array = make_array(1,2,3,4,5);
Und verwendet alle Arten von coolen C ++ 11-Sachen:
- Variadische Vorlagen
sizeof...
- rWertreferenzen
- perfekte Weiterleitung
std::array
, Na sicher- einheitliche Initialisierung
- Weglassen des Rückgabetyps mit einheitlicher Initialisierung
- Typinferenz (
auto
)
Ein Beispiel finden Sie hier .
Wie @Johannes im Kommentar zur Antwort von @ Xaade ausführt, können Sie verschachtelte Typen mit einer solchen Funktion jedoch nicht initialisieren. Beispiel:
struct A{ int a; int b; };
// C syntax
A arr[] = { {1,2}, {3,4} };
// using std::array
??? std_array = { {1,2}, {3,4} };
Außerdem ist die Anzahl der Initialisierer auf die Anzahl der von der Implementierung unterstützten Funktions- und Vorlagenargumente beschränkt.
TMP
Ihre Frage?