typedef "variablenabhängig"
-
Hallo,
weiß jemand wie ich folgendes Problem am elegantesten lösen könnte:
1.) Es wird je nach Wert einer Variablen A eine von 5 Funktionen aufgerufen.
Ich habe das bisher nur über 5 Funktionen lösen können, weil jeweils ein definierter Typ "MT" anders (abhängig vom Wert der vorangegangenen Variable) definiert wird.
2.) Momentan steht z.B. in der aufgerufenen Funktion 1 :
typedef signed int MT;
...in Funktion 2:
typedef double MT;
...und so weiter.
Es wäre schön, wenn es eine Lösung gäbe, die es ermöglicht, mit nur einer anstatt von 5 Funktionen diesen Typ "MT" anders zu definieren. Also wenn Variable A=... dann ist Typ "MT" als ... definiert).
Dank und Gruß
Thomas
-
Nach dem wenigen was du bisher preisgegeben hast, hört sich das nach einem Funktionstemplate an sowie einem switch/case ausdruck, der explizit je nach Parameter die verschiedenen Instanzen des Templates aufruft.
-
Du kannst zur Laufzeit keine neuen Typen erzeugen. Also muss jeder Wert von A für sich behandelt werden. Allerdings brauchst du nur eine Templatefunktion, wenn alle 5 Funktionen gleich definiert sind.
template <typename MT> void func() { // Hier MT benutzen } void foo(int A) { switch (A) { case 1: func<int>(); break; case 2: func<float>(); break; case 2: func<double>(); break; // ....... default: break; } }
-
Wow! Das isses!
Vielen Dank!
Gruß
Thomas
-
Hallo,
jetzt war ich doch etwas voreilig. Weil es einleuchtend ausschaut und ich es nicht sofort testen konnte. Ich kriege es nicht gebacken. So schaut es aus:
int output( void *outputBuffer, void *inputBuffer, ...) { unsigned int i; typedef float TYPE; OutputData *oData = (OutputData*) data; TYPE *out = (TYPE *)outputBuffer; TYPE *buf = &((TYPE *)oData->buffer)[oData->position]; ... ... } int main( int argc, char *argv[] ) { ... // oput wird hier übergeben. Davon abhängig ist die typedef float TYPE oben. Das kann dann also auch z.B. typedef double TYPE sein switch (oput) { case 1: try { openStream( ..., &output, ... ); ... } break; case 2: ... }Die erste Funktion habe ich bisher mehrmals mit verschiedenen typedef xy TYPE eingesetzt und in switch/case entsprechend aufgerufen.
Vielleicht kann mir nochmal jemand auf die Sprünge helfen...
Dank und Gruß
Thomas
-
BUÄRKS. void-Pointer und C-Casts und weiß der Henker was für Verbrechen wider die Wartbarkeit du da noch untergebracht hast. Warum versuchst du es nicht mit C++-Mitteln?
-
pumuckl schrieb:
BUÄRKS. void-Pointer und C-Casts und weiß der Henker was für Verbrechen wider die Wartbarkeit du da noch untergebracht hast. Warum versuchst du es nicht mit C++-Mitteln?
Ich hätte es selbst nicht besser formulieren können...

IRGENDWIE so sollte die Funktion im Endeffekt aussehen...:
template <class T> int output( T *outputBuffer, T *inputBuffer, ...){ unsigned int i; OutputData *oData = reinterpret_cast<OutputData*>(data); T *out = reinterpret_cast<T*>(outputBuffer); T *buf = &(reinterpret_cast<T*>(oData->buffer))[oData->position]; ... ... }Edit: Die Casts sind alle unnötig...wie mir auffällt

-
Hacker schrieb:
pumuckl schrieb:
BUÄRKS. void-Pointer und C-Casts und weiß der Henker was für Verbrechen wider die Wartbarkeit du da noch untergebracht hast. Warum versuchst du es nicht mit C++-Mitteln?
Ich hätte es selbst nicht besser formulieren können...

IRGENDWIE so sollte es eigentlich aussehen...:
template <class T> int output( T *outputBuffer, T *inputBuffer, ...){ unsigned int i; OutputData *oData = reinterpret_cast<OutputData*>(data); T *out = reinterpret_cast<T*>(outputBuffer); T *buf = &(reinterpret_cast<T*>(oData->buffer))[oData->position]; }
Der ursprüngliche Code ist wahrscheinlich Unfug. Das hier ist grober Unfug. Das Problem ist nämlich nicht die Syntax.