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 🤡


  • Mod

    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.


Anmelden zum Antworten