Zeiger/Referenz auf Typ "beliebige Version eines Templateklasse"?



  • Hallo,
    hab leider meinen Stroustrup nicht zur Hand und alle Template-Tutorials decken meine Frage nicht ab:

    Ich habe eine Template-Klasse ála "template<class N, class E> graph".

    Zur Ausgabe will ich eine Klasse "GraphWriter" schreiben. Diese Klasse benutzt natürlich meine Template-Klasse "graph". Daher hätte ich in der Klasse GraphWriter gerne eine Membervariable als Zeiger oder Referenz auf graph.

    Konsequenterweise müsste ich dann aber aus der GraphWriter-Klasse ebenso eine Template-Klasse machen, also

    template<class N, class E>
    class GraphWriter {
    ...
    graph<N,E>& m_graph;
    }
    

    Andererseits hängt das, was GraphWriter macht, nicht wirklich von den Template-Parametern des Graphen ab und könnte generell für alle Graphen gelten. Daher würde ich gerne vermeiden, aus GraphWriter eine Template-Klasse zu machen. Das Problem dann: Wie deklariere ich den Zeiger auf den graph? Einfach vor
    diese Variable "template<class N, class E>" schreiben ist verboten (gibt ja keine "Variablen"-Templates)...

    Und das, was ich über "Spezialisierung", betrifft auch nur Spezialisierungen von bereits als Template-Klassen angelegten Klassen...

    Was kann ich tun?

    Gruß,
    Supertramp



  • Versuch's doch mal mit einer allgemeinen Basisklasse, die du halten kannst:

    class graph_base
    {...};
    
    template<...>
    class graph : public graph_base
    {...};
    
    class GraphWriter
    {
      graph_base& m_graph;
      ...
    };
    

    Ansonsten: Ist es denn notwendig, daß der GraphWriter an einen bestimmten Graphen angeschlossen wird? Wenn ja, warum können ihm dann dessen Template-Parameter egal sein (was stellen die überhaupt dar?)?



  • Instanzen eines Klassen-Templates (mit unterschiedlichen Template Parametern) sind "unrelated", daher kann man auch keinen Zeiger auf "irgendeine Instanz von X" haben.
    Siehe CStoll, mach ne gemeinsame Basisklasse die das Interface definiert (virtual pure und co), dann kannste nen Zeiger auf diese Basisklasse verwenden.



  • Klingt gut. Danke.
    Irgendwie denke ich oft noch zu Javaesk 😉



  • Huch?
    In Java gibts garkeine Templates. Irgendwie vermischt und verwechselst du in Gedanken Dinge, z.B. Templates und Generics.


Anmelden zum Antworten