[C++11] std::initializer_list
Verfasst: 10.11.2011, 18:18
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:
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:
Ich meine, folgender Code geht ja auch problemlos und sowas würd ich gern für eine Klasse für statische Arrays ermöglichen:
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};
}
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};
}
Code: Alles auswählen
int arr[] = {1, 2, 3, 4, 5};