[C++11] std::initializer_list

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

[C++11] std::initializer_list

Beitrag von BeRsErKeR »

Hallo hab da mal ne Frage zur std::initializer_list. Hat die Klasse irgendwie eine Art Größe (Anzahl der Elemente), die zur Compilezeit in Form einer const_expr zur Verfügung steht?

Folgendes hab ich vor:

Code: Alles auswählen

template <typename T, size_t N>
class some_array
{
public:
some_array(std::initializer_list<T> il)
{
for (auto iter(il.begin()), size_t i=0; i<N && iter != il.end(); ++i, ++iter)
{
arr[i] = *iter;
}

private:
T arr[N];
}
};

int main(int argc, char **argv)
{
// das geht nicht, wäre aber schön
some_array arr{1, 2, 3, 4, 5};
}
Ziel ist es, dass die Array-Klasse implizit, durch die zugewiesene initializer_list ({1,2,3,4,5}) sowohl Typ, als auch Größe des Arrays erkennt.

Weil die Anzahl der Elemente der initializer_list wäre in dem Fall ja zur Compilezeit mit 5 bekannt. Außerdem hat eine initializer_list, die ich in den geschweiften Klammern angebe, doch eigentlich immer eine definierte Anzahl an Elementen, oder irre ich mich da? Wäre es nicht irgendwie zweckmäßig, dass die std::initializer_list auch ein zweites Template-Argument für die Anzahl der Elemente hätte? Also so wie some_array in dem Beispiel auch? Dann könnte der Code sogar funktionieren, wenn man den Ctor entsprechend anpasst:

Code: Alles auswählen

template <typename T, size_t N>
class some_array
{
public:
some_array(std::initializer_list<T, N> il)
{
for (auto iter(il.begin()), size_t i=0; i<N && iter != il.end(); ++i, ++iter)
{
arr[i] = *iter;
}

private:
T arr[N];
}
};

int main(int argc, char **argv)
{
// würde es jetzt gehen?
some_array arr{1, 2, 3, 4, 5};
}
Ich meine, folgender Code geht ja auch problemlos und sowas würd ich gern für eine Klasse für statische Arrays ermöglichen:

Code: Alles auswählen

int arr[] = {1, 2, 3, 4, 5};
Ohne Input kein Output.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++11] std::initializer_list

Beitrag von Krishty »

il.size()?

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: [C++11] std::initializer_list

Beitrag von BeRsErKeR »

Krishty hat geschrieben:il.size()?

Gruß, Ky
Ist das zur Compilezeit auswertbar? Finde leider keine hinreichend gute Doku dazu und kanns gerade nicht testen.
Ohne Input kein Output.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++11] std::initializer_list

Beitrag von Krishty »

Die Funktion ist constexpr deklariert, also ja – unter der Prämisse, dass dein Compiler das auch implementiert.

Hinreichend Quellen finde ich auch nicht; aber ein paar Websites sagen das und alles andere wäre idiotisch.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten