5 Stimmen

Vorlage, die die Schnittstelle

Ist es möglich, eine Vorlage zu erstellen, die Typen akzeptiert, die eine bestimmte Schnittstelle implementieren? Zum Beispiel möchte ich dem Benutzer der Vorlage sagen: Du kannst alles in meinem Container speichern, solange es die folgende Schnittstelle implementiert Init() y Destroy() Methoden.

Gracias

0voto

Oren S Punkte 1792

Ja, das können Sie.

Es ist jedoch ziemlich kompliziert (fortgeschrittene Meta-Programmierung von Vorlagen) Das ganze Konzept basiert auf der Eigenschaft "Substitutionsfehler ist kein Fehler (SFINAE)" in C++-Vorlagen.

Im Wesentlichen können Sie die Vorlage wie folgt verwenden 'template <typename T, void (T::*)()>' und instanziieren mit <T, T::Init> in Ihrem Vektor. Wenn die Ersetzung nicht vorhanden ist, erhalten Sie einen Ersetzungsfehler (das SFINAE-Prinzip wird hier angewandt, da Sie in den meisten Fällen stattdessen den Konstruktor verwenden möchten).

Dies ist natürlich eine stark vereinfachte Beschreibung. Es tut mir leid, dass ich derzeit keine bessere Beschreibung liefern kann, aber vielleicht möchten Sie einen Blick darauf werfen diese Diskussion . Suche nach has_member und is_call_possible.

Ich hoffe, es hilft.
Oren

0voto

sbi Punkte 211669

Eigentlich ist das Gegenteil der Fall: Wenn Ihre Vorlage Folgendes erfordert Init() y Destroy() ist es unmöglich, ihn mit einem Typ zu instanziieren, der no haben diese beiden.

Das einzige Problem mit Vorlagen in dieser Hinsicht ist, dass die Anforderung implizit ist (d.h. die Vorlage kompiliert nicht an der Stelle, an der die Elemente in der Vorlage benötigt werden), nicht explizit (d.h. der Compiler sagt Ihnen, was an der Stelle der Instanzierung fehlt). Konzepte sollten das beheben, aber sie waren aus der nächsten Norm herausgenommen vor einer Weile.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X