Rückgabetyp einer Funktion variabel bestimmen?
-
Shinja schrieb:
...
Aber der Threadersteller woltle wohl eher sowas wietemplate<class T> T foo(int i);oder so, denke ich.
Das meinte ich mit
Simon2 schrieb:
.. ich denke aber, der OP möchte aber identische Aufrufparameter.
Gruß,
Simon2.

Gruß,
Simon2.
-
genau Shinja .. das wollte ich eigentlich sagen, ok mein Beispiel war wohl nicht irreführend..
-
Simon2 schrieb:
spakko schrieb:
...Ich werde mir alles noch mal genauer anschauen

Tu das.
Schaue Dir aber auch nochmal genau an, wofür Du das eigentlich zu brauchen meinst. Ich kenne das eigentlich nicht, dass Funktionen völlig verschiedene Dinge zurückgeben müssen. Wenn die Dinge keinerlei Gemeinsamkeit haben, weiß ich nicht, ob es wirklich "dieselbe Funktion" ist.Der Aufrufer muss (meist) sowieso hinterher herausbekommen, welchen Typ er da in der Hand hält ... je länger man diese "Ungewissheit" aufrecht erhalten will, desto komplexer wird das Ganze - oftmals vollkommen überflüssig.
Gruß,
Simon2.
Nur mal so ne Überlegung, was daraus werden soll:
DBase db("DNS"); db.Connect(); RSet rs(db.Execute("SQL-Irgendwas...")); rs.MoveFirst(); do { cout << rs.Fields("COL-Irgendwas").Value() << endl; } while(rs.MoveNext()); rs.Close(); db.Close();Spakko :xmas1:
-
Spakko schrieb:
...
Nur mal so ne Überlegung, was daraus werden soll:DBase db("DNS"); db.Connect(); RSet rs(db.Execute("SQL-Irgendwas...")); rs.MoveFirst(); do { cout << rs.Fields("COL-Irgendwas").Value() << endl; } while(rs.MoveNext()); rs.Close(); db.Close();Spakko :xmas1:
Sowas hatte ich befürchtet.

OK, da braucht man wirklich ein Konzept "generischer Typen".
Wir hatten da einen Externen in unserer Firma, der hatte etwas Vergleichbares geschrieben ... und es war sehr gut ... und seeeehr aufwendig !Als Erstes solltest Du Dir überlegen, wann und wie die Typinformation der DB in Dein Programm übergeben werden: Zur Compile-/Link/-Laufzeit ?
Je früher, desto "entspannter" kannst Du generisch programmieren (unaufwendiger, sicherer, ...).Außerdem musst Du Dir überlegen, welce DB-interne Strukturen (Schlüsselbeziehungen, delete-Rules, Joins, Nullables, ....) Du nach Außen nutzbar machen möchtest ... und wie Du das abbildest.
Schließlich: Denke bei Deinen Entscheidungen nicht nur an Deine Schnittstelle, sondern auch an den armen Programmierer, der das nutzen muss - und daran, dass Du vermutlich in Konkurrenz zu "DB-eigenen APIs" (SQL, ...) stehst.
Wenn Deine Schnittstelle komplizierter zu nutzen ist als diese, wird sie sich kaum durchsetzen.Naja, Du hast ja schon einiges zum Lesen und rumprobieren bekommen.
Frohe Weihnachten wünscht,
Simon2.
-
maybe schrieb:
genau Shinja .. das wollte ich eigentlich sagen, ok mein Beispiel war wohl nicht irreführend..
das nicht kann man streichen
habs verpeilt
-
… void fo0(); void foo(int); void foo(double); int foo(double); // Fehler .. und da es in diesem thread nunmal um den rückgabe wert geht // habe ich gesagt mit overloading geht das nicht. // Fehler: Hat gleiche Signatur wie void foo(double)ich habe mich auch auf diene aussage hier bezogen..
Simon2 schrieb:
Das kann man auch mit normalem Overloading ohne templates machen .. ich denke aber, der OP möchte aber identische Aufrufparameter.
aber ich denke mitlerweile ist klar geworden was du sagen wolltest und was ich sagen wollte
oder?gruss
maybe
-
maybe schrieb:
...
aber ich denke mitlerweile ist klar geworden was du sagen wolltest und was ich sagen wollte
oder?gruss
maybeJapp - mir ging es eigentlich nur darum, dass Dein template-Ansatz zu kurz griff (Rückgabetyp = Parametertyp).
Peace,
Simon2.
-
Mal ne dumme Frage: sowas wie:
template<class aufruf,class rueckgabe> rueckgabe foo(aufruf i);geht ja wohl nicht, oder? Waere ja das gleiche wie mit
string foo(int i);
int foo(int i);und das geht ja auch nicht. Aber ich wollte nur mal sicherheitshalber nachfragen.
-
Doch, sowas geht - allerdings mußt du dann direkt angeben, welche Spezialisierung verwendet werden soll (Beispiele für sowas sind boost::lexical_cast<> oder std::bitset::to_string<>()).