10 Stimmen

C++ boost forward declaration Frage

Ich verbringe einige Zeit mit der Untersuchung boost:: Bibliotheksarchitektur und interessierte sich für die folgende Tatsache:

In einigen Teilen der Bibliotheken wird ein yyy_fwd.hpp Idee wird recht häufig verwendet (siehe boost/detail ou boost/flyweight für Beispiele).

Diese Dateien enthalten offensichtlich nur Vorwärtsdeklarationen einiger schablonenbasierter Klassen und könnten, soweit ich weiß, in Bezug auf die Kompilierungszeit von Vorteil sein.

Könnte mir jemand sagen, in welchen Fällen sie hilfreich sind und ob ich die gleiche Idee bei der Gestaltung meiner eigenen Vorlagen verwenden sollte?

Ich danke Ihnen.

3voto

Kirill V. Lyadvinsky Punkte 92957

Forward-Deklarationen werden benötigt, um Abhängigkeiten zur Kompilierzeit zu reduzieren. Zum Beispiel bei der Implementierung von Pimpl Idiom.

Ein weiterer Fall ist zum Beispiel dieser, boost::pool * hängt ab von windows.h auf der Windows-Plattform. Bei der Erstellung meiner Schnittstelle möchte ich die Benutzer meiner Klasse nicht dazu zwingen, die Systemheader einzubinden, indem ich meine Schnittstelle verwende.


* Ok, das ist ein schlechtes Beispiel, denn boost/poolfwd.hpp enthält noch windows.h aber ich hoffe, dass sie dieses Problem beheben werden. Und ich hoffe, Sie verstehen die Idee.

2voto

UncleBens Punkte 39755

Ich weiß nicht, wie es bei boost ist, aber diese Vorwärtsdeklarationen gibt es auch in der Standardbibliothek. Zum Beispiel, <iosfwd> enthält Forward-Deklarationen für Streams (die Templates sind und sich normalerweise hinter Typdefs verstecken).

Dieser Header ist von Vorteil, wenn man einen überladenen Operator<< deklariert.

In Ihrer Kopfzeile:

#include <iosfwd>

class X { ... };

std::ostream& operator<< (std::ostream& os, const X& x);

Beachten Sie, dass die Kopfzeile nicht die vollständige Definition von ostream (= basic_ostream<char, char_traits<char> > ).

Der Grund für die Kopfzeile ist, dass es mühsam ist, diese Vorlagen selbst zu deklarieren. Für das obige Beispiel würde es etwa so aussehen:

namespace std {
    template <class CharT>
    class char_traits;

    template <class CharT, class CharTraits>
    class basic_ostream;

    typedef basic_ostream<char, char_traits<char> > ostream;
}

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