Typename als Vorwärtsdeklaration?



  • Hallo,

    gibt es eigentlich zur Zeit einen Vorschlag an das Standardisierungsgremium Vorwärtsdeklarationen robuster zu machen? Je nach Typ muss man die Vorwärtsdeklaration anders machen. Hier ein paar Beispiele:

    typedef int Nodeid;
    class Node;
    namespace Graph {
       template<typename T> Edge;
    }
    

    Das ist nicht besonders robust, da sich die Art eines Typs ändern kann, man es überall nachziehen muss und man die Art des Typs kennen muss. Wenn zum Beispiel Nodeid auch zu einer Klasse wird, muss man das überall nachziehen. Ich würde da natürlicherweise das typename keyword für Vorwärtsdeklarationen nehmen. Das könnte alles erschlagen (wenn ich nicht etwas übersehe) und wäre robust.

    typename Nodeid;
    typename Node;
    typename Graph::Edge;
    

    Wenn sich die Art eines Typs ändert, muss man das dann trotzdem an vielen Stellen nachziehen, muss sich aber nicht um Vorwärtsdeklarationen kümmern. Der Hauptvorteil ist, dass man sich nicht durch die Includehierarchie einer gekauften Library wühlen muss, um eine Vorwärtsdeklaration zu erzeugen. Und folgendes geht auch nicht einfach so:

    namespace std {
       class ostream;
    }
    

    Da muss man den Header <iosfwd> includen, der noch viel deklariert, das man nicht nutzt.

    Gibt es also einen Standardisierungsvorschlag, das zu vereinfachen?



  • Klar könnte es so eine "generische" Forward-Deklaration dem Nutzer leichter machen - aber dafür wird es für den Compiler/Linker schwieriger, dir dein Programm zusammenzusetzen (btw, sobald der Compiler mehr machen soll als nur Pointer/Referenzen durch die Gegend zu reichen, reicht die Forward-Deklaration sowieso nicht mehr aus).



  • CStoll schrieb:

    Klar könnte es so eine "generische" Forward-Deklaration dem Nutzer leichter machen - aber dafür wird es für den Compiler/Linker schwieriger, dir dein Programm zusammenzusetzen (btw, sobald der Compiler mehr machen soll als nur Pointer/Referenzen durch die Gegend zu reichen, reicht die Forward-Deklaration sowieso nicht mehr aus).

    Das ist ja jetzt auch schon der Fall. Wenn das Layout oder die Größe eines Objektes benötigt werden, muss man den Header doch includen. Aber da ich noch fast ganz ohne Templates auskomme und nie inline benutze, kommt es sehr selten vor, dass ich in einem Header die vollständige Definition eines Typs benötige.


Log in to reply