auto für Funktionszeiger
-
Sone schrieb:
auto + initializer_list ist wohl ne Pitfall.
Nein, ist sie nicht. Die Semantik ist absolut gewollt und in Ordnung.
Ist es doch.
Wenn man sowas wie der OP im Kopfbeitrag hier schreibt, dann will man nen Container als Ergebnis. Bekommt aber neinitializer_list.
Aber vielleicht solltest du das Wort Pitfall mal nachschlagen...
-
hustbaer schrieb:
Sone schrieb:
auto + initializer_list ist wohl ne Pitfall.
Nein, ist sie nicht. Die Semantik ist absolut gewollt und in Ordnung.
Ist es doch.
Wenn man sowas wie der OP im Kopfbeitrag hier schreibt, dann will man nen Container als Ergebnis. Bekommt aber neinitializer_list.
Aber vielleicht solltest du das Wort Pitfall mal nachschlagen...Danke, ich weiß, was pitfall heißt. Ich kann englisch, genau wie du.

Und ich sage: Wer einen Container will, muss schon explizit hinschreiben welchen. Ich sehe ja, dass C++11-Anfänger da in eine Art Falle tappen könnten, trotzdem geht die Deduzierung bei auto nun einmal ganz logisch vonstatten.
-
Warum nicht std::tuple:
#include <iostream> #include <string> #include <tuple> struct blau_t { std::string str_; explicit blau_t(std::string str) : str_(str) {} }; void f(int i, int j) { std::cout << "f(" << i << "," << j <<")\n"; } void g(int i, double j) { std::cout << "g(" << i << "," << j <<")\n"; } void h (blau_t blau) { std::cout << "h -> " << blau.str_ << "\n";} int main() { auto fun_array = std::make_tuple(f,g,h); std::get<0> (fun_array) (1,2); std::get<1> (fun_array) (1,2.5); std::get<2> (fun_array) (blau_t("Hallo")); return 0; }
-
ScottZhang schrieb:
Warum nicht std::tuple:
Ich denke, es geht hierbei darum, Funktionen mit gleichen Signaturen in einen Container zu speichern. Tuples verwendet man ja meistens bei verschiedenen Typen.
Ich sehe ich auch nicht so den Sinn darin, jedesmal std::get aufzurufen, wenn man genausogut gleich g und h verwenden könnte, aber darin, die Funktion dynamisch auszuwählen schon.
-
Warum nicht std::tuple:
Darum. Es macht hier keinen Sinn.
tuplefindet praktisch nur mit variadic templates eine Daseinsberechtigung. Es ist viel zu statisch. Schon nur um auf das n-te Element zuzugreifen (wobei n ein erst zur Laufzeit feststehender Wert ist) braucht man einen Workaround.
-
Sone schrieb:
Warum nicht std::tuple:
Darum. Es macht hier keinen Sinn.
tuplefindet praktisch nur mit variadic templates eine Daseinsberechtigung. Es ist viel zu statisch. Schon nur um auf das n-te Element zuzugreifen (wobei n ein erst zur Laufzeit feststehender Wert ist) braucht man einen Workaround.Tuple ist genial. Damit können sogar Funktionsobjekte ohne Overhead gespeichert werden. Und ein foreach ist auch recht einfach zu schreiben.
Das Stichwort "variadic templates" hat in diesem Zusammenhang aber gar keinen Sinn. Und praktisch keine Daseinsberechtigung. Es ist etwas völlig anderes. Tuple ist ein Weg, variadic templates zu vermeiden.
-
Damit können sogar Funktionsobjekte ohne Overhead gespeichert werden.
Zeig was du meinst.
Und ein foreach ist auch recht einfach zu schreiben.
Wovon redest du?
Zeig mal ein wenig Code!
-
Sone schrieb:
Danke, ich weiß, was pitfall heißt. Ich kann englisch, genau wie du.

Und ich sage: Wer einen Container will, muss schon explizit hinschreiben welchen.
"Ist ein Stolperstein" bedeutet weder "ist schlecht" noch "sollte geändert werden".
Klar ist es logisch. Und vermutlich wäre es auch keine gute Idee es zu ändern.Nur "ist logisch" heisst halt nicht "jeder Anfänger checkt es". Und damit ist die Aussage "ist ein Stolperstein" mMn. richtig.
Ich sehe ja, dass C++11-Anfänger da in eine Art Falle tappen könnten, trotzdem geht die Deduzierung bei auto nun einmal ganz logisch vonstatten.
Na siehste, du hast es ja eh verstanden.
Ich denke mal du hast einfach zuviel in - zumindest meine - Aussage hineininterpretiert. Ich hab' ja nicht vorgeschlagen dass es geändert werden sollte.
Ich hab lediglich geschrieben dass, wenn man sowas schreibt (was man halt nicht tun sollte), man vermutlich was anderes will als man dann bekommt.ps: Wenn man jeden Stolperstein für Anfänger den eine Sprache bietet entfernt, dann kommt vermutlich 'was raus was man als Anfänger super-schnell verwenden kann, womit man man aber als Fortgeschrittener nicht sinnvoll arbeiten kann. Bzw. einfach nicht will, weil es ein unlogisches, unübersichtliches & grausames Etwas geworden ist.
-
hustbaer schrieb:
ps: Wenn man jeden Stolperstein für Anfänger den eine Sprache bietet entfernt, dann kommt vermutlich 'was raus was man als Anfänger super-schnell verwenden kann, womit man man aber als Fortgeschrittener nicht sinnvoll arbeiten kann. Bzw. einfach nicht will, weil es ein unlogisches, unübersichtliches & grausames Etwas geworden ist.
Klingt wie eine sehr subtile Anspielung

-
Auf?
-
@Sone: Hm, ja das Problem sieht zwar erstmal statisch aus, aber wenn nen Zugriff für eines (kein for_each) erst zur Laufzeit bekanntes n gefordert ist, geb ich dir recht, dann wirds kompliziert.