template mit unbekanntem Rückgabetyp [C++0x]
-
Hallo
template<class T1, class T2> ??? rechne(T1 a, T2 b) { return a+b; }Das soll nicht nur mit PODs sondern auch mit eigenen Klassen etc gehen.
Ich bin auf std::result_of gestossen aber ich weiß weder ob es das richtige ist noch bin ich in der Lage das anzuwenden.
Ist das überhaupt möglich?
Ty
-
Du meinst, ob es in C++0x möglich ist? Ja, es ist.
template<typename T1, typename T2> auto rechne(T1 const& a, T2 const& b) -> decltype(a+b) { return a+b; }
-
Spitze! Bin ich zu dümmelig zu googeln oder gibts da keine anständigigen Tuts im Netz? Für ein Buch (falls sowas überaupt schon gibt) bin ich zu arm

TYVM
-
Ach und kann man es auch irgendwie umgehen die GESAMTE Rechnung in -> decltype(Hier navier stokes rechnung) zu kopieren?
-
Sebastian Pizer schrieb:
Du meinst, ob es in C++0x möglich ist? Ja, es ist.
template<typename T1, typename T2> auto rechne(T1 const& a, T2 const& b) -> decltype(a+b) { return a+b; }Als soweit ich es mitbekommen habe, hat sich die Syntax dafür doch geändert.
Sie müsste jetzt so aussehen:template<typename T1, typename T2> [] rechne(T1 const& a, T2 const& b) -> decltype(a+b) { return a+b; }Nachzulesen hier:
http://en.wikipedia.org/wiki/C%2B%2B0x#Alternative_function_syntax
und hier:
http://www.research.att.com/~bs/C++0xFAQ.html#suffix-return
Gruß Gate
-
Diese Frage wollte ich auch demnächst stellen!

Meine Frage dazu: Wie hat dieses decltype auszusehen wenn ich nun die Funktion "rechne" wrappe?
template<typename T1, typename T2> auto rechne(T1 const& a, T2 const& b) -> decltype(a+b) { return a+b; } template<typename T1, typename T2> auto wrapper(T1 const& a, T2 const& b) -> decltype(??) { return rechne(a,b); }Ich habe schon decltype(rechne(a,b)) versucht, was aber anscheinend nicht korrekt ist ...

BTW: Gibts da einen Unterscheid zwischen const typ& und typ const& ?
-
Gate schrieb:
Als soweit ich es mitbekommen habe, hat sich die Syntax dafür doch geändert.
Sie müsste jetzt so aussehen:template<typename T1, typename T2> [] rechne(T1 const& a, T2 const& b) -> decltype(a+b) { return a+b; }Okay. Ich dachte eigentlich, die Syntax mit den eckigen Klammern wäre (unbenannten) Lambda-Ausdrücken vorenthalten. Aber ich muss gestehen, dass ich nicht gerade auf dem Laufenden bin, was C++0x angeht.
markouser schrieb:
Ich habe schon decltype(rechne(a,b)) versucht, was aber anscheinend nicht korrekt ist ...

Was geht denn konkret nicht (Fehlermeldung)?
markouser schrieb:
BTW: Gibts da einen Unterscheid zwischen const typ& und typ const& ?
Nein.
-
Gate schrieb:
Als soweit ich es mitbekommen habe, hat sich die Syntax dafür doch geändert.
Sie müsste jetzt so aussehen:template<typename T1, typename T2> [] rechne(T1 const& a, T2 const& b) -> decltype(a+b) { return a+b; }Das war ein Vorschlag, ja. Aber meines Wissens nach wurde der beim ersten Mal abgelehnt. Der aktuellste Entwurf N2914 enthält noch die Version mit "auto". Allerdings wurde eine überarbeitete Version des Vorschlag für die "unified function syntax" eingereicht. Ob der angenommen wurde, weiß ich nicht.
Gate schrieb:
Nachzulesen hier:
http://en.wikipedia.org/wiki/C%2B%2B0x#Alternative_function_syntax
und hier:
http://www.research.att.com/~bs/C++0xFAQ.html#suffix-return
Gruß GateTja ... wir haben scheinbar ein Widerspruch. Ich denke, diese Seiten spiegeln den Stand vor der Abstimmung wieder, in der die einheitliche Funktionssytnax beim ersten Mal abgelehnt worden ist. Es könnte aber auch sein, dass die zweite Version des Vorschlags akzeptiert worden ist und es bisher nur noch keinen Entwurf gibt, wo der Vorschlag eingearbeitet worden ist ...
Mir persönlich gefällt die []-Syntax für "normale Funktionen" nicht.
Gruß,
SP
-
markouser schrieb:
Ich habe schon decltype(rechne(a,b)) versucht, was aber anscheinend nicht korrekt ist ...

Es kann gut sein, dass Dein Compiler noch buggy ist. Es scheint beim GCC (auch noch bei Version 4.4.1) erhebliche decltype Probleme in Verbindung mit Templates und SFINAE zu geben. Wenn da also etwas nicht klappt, muss es nicht an Dir liegen.
decltype(rechne(a,b))sollte eigentlich funktionieren.Gruß,
SP
-
B&C schrieb:
Ach und kann man es auch irgendwie umgehen die GESAMTE Rechnung in -> decltype(Hier navier stokes rechnung) zu kopieren?
decltype wird auf einen Ausdruck angewendet. Eine Folge von Anweisungen geht schonmal nicht. Es hat auch keiner gesagt, dass der Ausdruck äquivalent zu dem sein muss, was Du in der Funktion ausrechnest. decltype ermittelt ja nur den Typen des Ausdrucks.
Schön wär's noch gewesen, wenn der "-> type-id"-Teil für einzeilige inline-Funktionen optional gewesen wäre. Man wird ja bei Lambdas auch nicht gezwungen, den Rückgabetypen anzugeben, wenn der Lambdakörper nur ein "return <ausdruck>;" enthält. Vielleicht tut sich da noch etwas ...

-
Sebastian Pizer schrieb:
Schön wär's noch gewesen, wenn der "-> type-id"-Teil für einzeilige inline-Funktionen optional gewesen wäre. Man wird ja bei Lambdas auch nicht gezwungen, den Rückgabetypen anzugeben, wenn der Lambdakörper nur ein "return <ausdruck>;" enthält. Vielleicht tut sich da noch etwas ...

Also soweit ich weiß ist dies auch bereits der Fall. In den vorher von mir geposteten Links ist das auch so ersichtlich. Zumindest in Stroustrups FAQ.
Hier der Auszug:Stroustrups FAQ schrieb:
We use the notation [] that we use to introduce lambdas to mean "return type to be deduced or specified later." Since that function body consists of just a return statement, we can eliminate the decltype and reduce the function definition to
template<class T, class U> [] mul(T x, U y) { return x*y; }