Statische Arraydaten als Funktionsparameter
-
Hallo,
folgendes Funktioniert:
void foo(const char * data) { } // hier legt der compiler automatisch ein statisches char Array an und übergibt es der Funktion foo("hello world");Frage:
kann man sowas (ähnliches) auch mit integern bzw. enum-Werten machen?enum someId { id0, id1, id2, id3, idInvalid }; class CFoo() { public: CFoo(const someId * configuration); } // das hier ist unschön, da die Konfiguration getrennt von den Objekten angelegt werden muss static const someId[] config0 = {id0, id2, idInvalid}; static const someId[] config1 = {id1, id2, id3, idInvalid}; CFoo foo0(config0); CFoo foo1(config1); // so etwas wäre schöner, compiliert aber in der Form leider nicht. CFoo foo0({id0, id2, idInvalid}); CFoo foo1({id1, id2, id3, idInvalid});=> Kann man den Compiler dazu veranlassen, das Array analog zu den strings automtatisch zu generieren?
Vielen Dank und schöne Grüße,
Martin
-
In C++11 geht das per std::initializer_list.
z.B.
// Die normale Funktion void foo(int const * bar) { // mach was mit bar } // Ein Wrapper um die normale Funktion void foo(initializer_list<int> init) { // laut cppreference.com liefert begin einen Zeiger auf das erste Element foo(init.begin()); // alternativ, um sicher zu gehen, falls begin doch einen Iterator liefert foo(&(*(init.begin()))); } // Aufruf: foo({1, 2, 3}); // das ruft erst die Funktion mit der initializer_list auf, welche wiederum deine eigentliche Funktion aufruft.Da das ein C++11 Feature ist, solltest du aber erstmal in der Doku deines Compilers nachschlagen, ob dieser initializer_lists bereits unterstützt.
-
Hallo DrakoXP,
danke für deine Antwort.
Dann führt an der "unschönen" Lösung wohl kein Weg vorbei.
Bin auf einem Embedded-System unterwegs und hab nicht mal die normale STL zur Verfügung, von C++11 Features ganz zu schweigen :-(.Gruß,
Martin
-
Ich kann zwar sehen, warum man im embedded-Bereich keine STL hat, aber Initializer-Lists sind doch nur Syntax, keine Funktionalität. Das wäre wie zu sagen, dass im embedded-Bereich immer
> >statt>>geschrieben werden muss, wenn man zwei Templateklammern schließt.