kleine Templatefrage



  • 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.


Anmelden zum Antworten