2013-04-17 12 views
5

Was ich tun möchte, ist eine Funktion, die jede Klasse oder Struktur (über Vorlagen) akzeptiert, aber auch die Funktion annehmen, dass es immer ein bestimmtes Mitglied in der übergebenen Klasse oder Struktur ist.Kann ich über eine Vorlage auf ein Struktur-/Klassenmitglied zugreifen?

In wohl-nicht-richtig-Code, würde es in etwa so aussehen:

template <class inputType> 
int doSomething(inputType voxel) 
{ 
    return voxel.density; 
} 

ich es, dass density Mitglied zu übernehmen will immer da sein wird und dass es immer ein int (oder was auch immer sein). Kann ich das machen? Und wenn ja, was passiert, wenn density nicht existiert? Wird es einfach einen Compilerfehler werfen?

Antwort

4

Es ist vollkommen legal, Vorlagen in C++ sind nicht vergleichbar mit einem anderen Ansatz (denke Java), dass Typ überprüft die generische Methode oder Klassen durch die Typvariable zu halten.

Eine C++ Vorlage wird mit jedem möglichen Typ kompiliert, den Sie verwenden, so dass jede einzelne Instanziierung für jeden spezifischen Typ kompiliert und typgeprüft wird. Wenn Sie versuchen, auf ein Feld zuzugreifen, das nicht in dem Typ enthalten ist, den Sie verwenden doSomething mit, dann erhalten Sie einen Compilerfehler.

+0

Wow! Sie haben meine Frage 3 Minuten nach meiner Anfrage beantwortet! Vielen Dank! (Plus es ist genau das, was ich gehofft habe) – Clonkex

1

Sie können dies auf jeden Fall tun, Vorlagen werden zur Kompilierzeit instanziiert und wenn der Typ dieses Mitglied nicht hat, wird es nicht kompilieren und Sie erhalten und Fehler. Vorlagenfunktionen sind grundsätzlich Verträge und solange der von Ihnen verwendete Typ dem Vertrag entspricht, wird es funktionieren.

In diesem Fall würde ich auch vorschlagen, dass Sie damit experimentieren, Websites wie LiveWorkSpace machen Experimentieren mit C/C++ ziemlich einfach und schmerzlos, wo immer Sie sind, und sie unterstützen die neuesten Versionen. Sie werden viel mehr lernen, wenn Sie solche Dinge ausprobieren. Sie können mehr solcher Werkzeuge in diesem vorherigen thread finden.

+0

Danke, ich werde mir das ansehen. Ich weiß, dass ich das in Code _before_ gefragt hätte, aber das würde entweder viel Zeit bedeuten, mein aktuelles Projekt zu modifizieren oder ein neues Projekt zu erstellen, nur um es zu testen. Keine der Optionen war sehr ansprechend. (Ich habe gerade LiveWorkSpace ausprobiert und die Website scheint nicht mehr zu funktionieren.) – Clonkex

+0

@Clonkex Ich benutze LiveWorkSpace ziemlich oft, aber ich bemerkte, dass es jetzt nicht mehr funktionierte, also habe ich den zweiten Link hinzugefügt, der auch viele andere Optionen hat. Normalerweise schlage ich nicht vor, dass jemand nur experimentiert, aber Sie scheinen genug Informationen zu haben, um die Dinge erfolgreich zu lösen, und manchmal ist die Barriere zum Experimentieren geringer als Sie denken, kann helfen. –

+0

Absolut; wenn ich daran gedacht hätte, Online-C++ - Compiler zu verwenden, bevor ich die Frage gestellt hätte, die ich hätte. Ich überlegte, ein neues Projekt zu erstellen, nur um es zu testen, aber dann entschied ich, dass es wahrscheinlich besser wäre, sicherzustellen, dass es tatsächlich in C++ erlaubt war, auch wenn es erfolgreich kompiliert wurde (es könnte später kompilieren, aber dann versteckte Probleme verursachen). Danke für den Link :) – Clonkex

Verwandte Themen