2010-12-27 4 views
0

Ist es möglich, eine Vorlage als Mitglied anzugeben, aber nicht alle Details? Oder wie kann ich das umgehen?Verwenden Sie Vorlagen als Mitglieder, wenn nicht alle Details bekannt sind

Beispiel funktioniert nicht, aber könnte Ihnen zeigen, was ich erreichen möchte.

template<typename T> 
struct Foo { 
    ///blah... 
}; 

struct Bar { 
    Foo* m_foo; 
}; 

Bar in diesem Fall ist eine Basisklasse, und in Abhängigkeit von den abgeleiteten Klassen weiß ich, wird nicht alle Einzelheiten Foo

Antwort

5

Sie entweder als auch Bar eine Template-Klasse machen, so können Sie diese Vorlage passieren können Argument entlang Foo, oder Sie können alle Foo<T> Variationen von einer gemeinsamen Schnittstelle erben (in C++ ist eine Schnittstelle nur eine abstrakte Klasse ohne Implementierung, alle Mitglieder sind reine virtuelle Funktionen) und dann Bar kann auf diese Schnittstelle verweisen.

Der erste Weg ist besser, wenn Bar nur einige Funktionen zur Verfügung stellt, die von einer Reihe abgeleiteter Klassen wiederverwendet werden.

Der zweite Weg ist besser, wenn Nachkommen von Bar polymorph verwendet werden.

+1

Es gibt eine ziemlich lange Diskussion über Vorlagen und ihre Methoden hier: http://stackoverflow.com/questions/3764912/dynamic-casting-variable-arguments-to-templates. Er wollte auch ein Foo * machen, was man mit Templates nicht machen kann (außer er erbt von einer gemeinsamen Basis). Aber da gibt es einige gute Ratschläge, wie man das erreicht, was ich denke, dass du es brauchst. – Tim

+0

@Tim: Danke für die Hintergrunddiskussion. Ich habe auf jeden Fall die Möglichkeit erwähnt, eine gemeinsame Basis zu verwenden. Glauben Sie, dass ein Teil meiner Antwort unklar ist? –

+0

Ich denke, deine Antwort ist in Ordnung (ich habe dich neu eingestellt). Ich verlinkte die andere Diskussion nur, weil es viel mehr Details (in der Frage und in den Antworten) gibt, einschließlich Codebeispiele. Ich dachte, die zusätzliche Referenz könnte PhilCK helfen (oder jemand anderen, der auf diese Seite trifft). – Tim

0

Der Code, den Sie oben haben, wird nicht funktionieren, da immer wenn Sie eine C++ Vorlage verwenden, müssen Sie angeben, was Argumente sind. Wenn Sie ein Foo eines unbekannten Typs speichern möchten, können Sie dies tun, indem Sie Bar über einen bestimmten Typ parametrisieren (z. B. eine Vorlage mit dem Typargument T erstellen), und anschließend einen Foo speichern. Dies steht im Gegensatz zu anderen Sprachen wie Java, wo Code wie das, was Sie oben beschrieben haben, legal ist, da Vorlagen in C++ anders funktionieren. Insbesondere Java-artige Genetiken kompilieren nur zu einer konkreten Darstellung und verwenden dann Laufzeitprüfungen, um zu überprüfen, ob sie richtig verwendet werden. C++ Template-Instanziierungen werden am Ende in separaten Code kompiliert, und so muss der Compiler in der Lage sein, zur Kompilierungszeit abzuleiten, was die Argumenttypen sind (damit er weiß, welcher Code erzeugt werden soll).

Verwandte Themen