• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Frage zu C++ Templates.

Mitglied seit
19.09.2001
Beiträge
2.532
Reaktionen
0
Was macht folgender Codeausschnitt?

Code:
template<typename T> 
typename T::ElementT at (T const& a, int i) 
{ 
    return a[i]; 
} 

void f (int* p) 
{ 
    int x = at(p, 7); 
}

Die generelle Funktionsweise von Templates ist mir klar, aber Zeile 2 überfordert mich etwas. Wäre nett, wenn jemand mal ausformulieren könnte, was dort eigentlich steht.
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
T ist irgendein container, welcher elemente vom typ T::ElementT enthält. at liefert so eins zurück.
 

RRA^StArFiRe

Guest
für "ElementT" fehlt dir aber noch ne typedef oder struct oder sowas, oder?

ach nee, is ja typename... hm obwohl, das bezieht sich doch aber nur aufs T x_X
 
Mitglied seit
19.09.2001
Beiträge
2.532
Reaktionen
0
Der Code-Ausschnitt stammt aus dem Buch "C++ Templates: The Complete Guide" von David Vandevoorde und Nicolai M. Josuttis.

Das Problem laut den Autoren ist, daß T zu int* aufgelöst wird, wodurch im Rückgabetyp T::ElementT das T ebenfalls durch int* ersetzt wird, was dann kein C++-konformer Code mehr sein soll.

Soweit sehe ich das ja noch ein, aber wo kommt das ElementT überhaupt her, und was macht der typename davor?
 
Mitglied seit
10.08.2000
Beiträge
12.908
Reaktionen
1
ElementT müsste vorher deklariert werden (in der Klasse T, da über T::ElementT darauf zugegriffen wird)
Die Methode geht dann davon aus, dass T im wesentlichen ein array ist, auf dessen i-te Stelle dann zugegriffen wird.
 
Mitglied seit
18.07.2001
Beiträge
2.152
Reaktionen
2
Ort
Nürnberg
ist jetzt zugegebenermassen etwas ot aber kennt der aktuelle c++ standard etwas vergleichbares wie die "where" bedingung bei C# generics? laenger kein c++ mehr angefasst :)

also in c# kann ich sagen ich will ne generische klasse und der typ T muss einen default constructor haben und nen interface implementieren... was so aussieht
Code:
public interface ICanDoShit
{
   void DoShit();
}

public class MyGenericClass<T> 
    where T : ICanDoShit, new()
{
    public T CreateSome()
    {
        T t = new T();
        t.DoShit();
        return t;
    }
}
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
Soweit sehe ich das ja noch ein, aber wo kommt das ElementT überhaupt her, und was macht der typename davor?

ElementT dürfte irgendein typedef sein, welches in der klasse steht, von der du ein objekt an at übergibst. typename ist notwendig, weil der compiler nicht weiss, dass das ein typ ist.
 

The_Company

Guest
Sind Templates nicht nur glorifiziertes Copy/Paste mit suchen/ersetzen?
Also alle "T" werden durch den Typen des ersten Parameters ersetzt und fertig.

Wie C Macros halt, nur ein bisschen skilliger.
 
Mitglied seit
10.08.2000
Beiträge
12.908
Reaktionen
1
Original geschrieben von The_Company
Sind Templates nicht nur glorifiziertes Copy/Paste mit suchen/ersetzen?
Also alle "T" werden durch den Typen des ersten Parameters ersetzt und fertig.

Wie C Macros halt, nur ein bisschen skilliger.

genau ;) skilliger halt
VIEL skilliger
 
Oben