kleine Templatefrage



  • Die mathem. Berechnung einer bestimmten Sache habe ich in einer Templateklasse realisiert.

    Übergibt man der Klasse den Datentyp "int", läuft es reibungslos, übergibt man hingegen ein float, muss die eine oder andere Zeile etwa so geändert werden:

    if (datentyp == float)
        dann mach es so; 
    else if (datentyp == int)
        dann mach es so und so;
    

    Grund: Es müssen andere Arraydimensionen alloziert werden.
    Kann man das überhaupt als Template realisieren, oder habe ich damit verloren?



  • Hi!

    Du könntest doch Funktionen spezialisieren auf einen bestimmten Datentyp. Dann wird entweder die spezialisierte Funktion oder die Templatefunktion für alle anderen Typen verwendet.

    Code-Hacker



  • wieso andre arraydimensionen?

    template<class T>
    class foo{
    //version 1
    T bar[10];
    //version 2
    char foobar[sizeof(T)*10];
    };
    

    ansonsten geht noch sowas:

    template<class T>
    class foo{
    char bar[1];
    };
    class foo<float>{
    char bar[40];
    };
    

    ansonsten kann man nich mehr machen, ohne zu wissen, was genau du machen willst-.-



  • ok, ich will es noch mal extremer verdeutlichen.
    Man kann auch mit Brüchen rechnen. Ich habe jetzt mal einen Ausschnitt mit float und dasselbe mit frac (=Bruch) angegeben.
    Kann man sowas template-isieren? Wenn ja, wie?

    //Implementation mit float
    void tabelle::search()
    {
    	const int z = m_spalten - 2 - (m_zeilen - 1);
    	float temp = 0;
    	for (int i = 0; i < z; i++)
    		if (m_arr[m_zeilen-1][i] < temp)
    		{
    			temp = m_arr[m_zeilen-1][i];
    			m_spa = i;
    		}
    }
    
    //Implementation mit frac
    void tabelle::search()
    {
        const int z = m_spalten - 2 - (m_zeilen - 1);
        float temp = 0;
    	for (int i = 0; i < z; i++)
    	{
    		frac f = m_arr[m_zeilen-1][i]; //frac = Bruchklasse
    		if (f.getq() < temp) //getq bestimmt Quotienten des Bruches
    		{
    			frac f2 = m_arr[m_zeilen-1][i]; 
    			temp = f2.getq();			
                m_spa = i;
            }
    	}
    }
    


  • Hallo,

    also deinen ersten Post hab ich verstanden, und da hat otze auch das Richtige gepostet. Was du jetzt hast, versteh ich nicht.

    Es sind zwei Funktionen mit dem gleichen Namen, die aber unterschiedlich definiert sind?! Ich sehe jetzt kein Kriterium, an dem man die Funktionen unterscheiden kann?!



  • Ich habe die Klasse u. a. einmal separat für float und für frac implementiert, weil die Algos eben nicht 100%ig deckungsgleich sind. Die beiden Codeschnipsel entstammen also zwei Klassen. Ich würde das aber gern über ein Template zusammenfassen, weiß aber nicht, ob das bei den dargestellten Codeunterschieden überhaupt möglich ist.



  • Hallo,

    doch, so wie otze schrieb:

    // Für alles...
    template<class T>
    void tabelle::search()
    {
    ...
    }
    
    // ...außer für float, dann mach das hier:
    template<float>
    void tabelle::search()
    {
    ...
    }
    


  • CarstenJ schrieb:

    Hallo,

    doch, so wie otze schrieb:

    // Für alles...
    template<class T>
    void tabelle::search()
    {
    ...
    }
    
    // ...außer für float, dann mach das hier:
    template<float>
    void tabelle::search()
    {
    ...
    }
    

    ähhm, eher

    template<>
    void tabelle<float>::search() { }
    

    oder

    template<>
    void tabelle::search<float>() { }
    

    je nachdem, ob es eine Member Template-Funktion ist, oder nicht 🤡



  • Ups...Naja, auf jeden Fall geht es... 🙂



  • Leider verstehe ich euch noch nicht ganz. Daher darf ich nochmal nachfragen, ja?

    Wenn ich float oder frac der Template-Klasse als Typ übergebe, dann ändert sich der Code, weil bei der Impementation von frac gegenüber der float-Variante einige Codezeilen hinzukommen (vgl. die beiden Beispiele).
    Die Funktion getq beispielsweise (siehe Beispiel für frac) entstammt der Klasse frac und ist für die Berechnung bedeutsam, hingegen wird sie bei Verwendung des Typs float gar nicht benötigt (siehe float-Beispiel).
    Der Rückgabewert (m_spa) ist zwar beide Male gleich, aber die Berechnung eine andere.

    Der Code ist also bei den beiden Typen nicht gleich und das ist doch die Voraussetzung für Templates (oder 😕 )?



  • ingo_ schrieb:

    Der Code ist also bei den beiden Typen nicht gleich und das ist doch die Voraussetzung für Templates (oder 😕 )?

    Ja schon, bloß falls jetzt z.b. ein Typ etwas anders macht wie alle anderen, kann man "explizit spezialisieren" (also das, was Shlo und andere oben gemacht haben).
    Somit kannst du für Typen, die etwas anderes machen, eigene Versionen schreiben, die dann aufgerufen werden.



  • @all: Danke.


Log in to reply