Forward-Declaring verschacheltes Template



  • Hi,

    Ja, Frage steht im Titel, wie geht das?

    Ich habe bereits herausgefunden, dass man gerne eine Extraheader mit Forwards für alle Templates anlegt. Aber ich bin über die Syntax unsicher.

    // A.h
    // Header mit Template-Definition
    template<typename AImpl> class A {};
    
    template<bool x> class B {};
    
    typedef A<B<true>> A1;
    typedef A<B<false>> A2;
    
    // someFunc.h
    // Hier in einem anderen Header will ich A1 nutzen, aber erst in der .cpp
    // die Implementierung bekannt machen
    #include "Forwards.h"
    
    void someFunc(const A1& a1);
    
    // Forwards.h:
    template<typename> class A;
    template<bool> class B;
    
    typedef A<B<true>> A1;
    typedef A<B<false>> A2;
    
    // someFunc.cpp
    #include "someFunc.h"
    #include "A.h"
    
    void someFunc(const A1& a1) // jetzt darf A gern definiert sein
    {
        // impl
    }
    

    Ist das in Forwards.h okay und so üblich? Oder wie macht man das? (soll unter MSVC10 laufen, aber wenn es mit C++11 und using besser geht, würde mich das als Bonusinfo auch interessieren)

    Danke im Voraus 🙂



  • Ich würde mich da nach <iosfwd> orientieren. So sparst du dir die doppelten typedefs.

    // eisfwd.h:
    template<typename> class A;
    template<bool> class B;
    
    typedef A<B<true>> A1;
    typedef A<B<false>> A2;
    
    // eisimpl.hpp
    template<typename AImpl> class A {}; 
    template<bool x> class B {};
    
    // eis.h
    #include "eisfwd.h"
    #include "eisimpl.hpp"
    
    // someFunc.h
    #include "eisfwd.h"
    
    void someFunc(const A1& a1);
    
    // someFunc.cpp
    #include "someFunc.h"
    #include "eis.h"
    
    void someFunc(const A1& a1) // jetzt darf A gern definiert sein
    {
        // impl
    }
    


  • Ah okay, also ein Header mehr zugunsten weniger typedefs. Gefällt mir, danke!



  • eisimpl.hpp braucht man nicht, man kann den Inhalt genau so gut gleich nach eis.h mit reinziehen.

    Bzw. von Eisflammes Version ausgehend...
    Lösch die typedef s aus A.h raus und mach statt dessen in A.h ein #include "Forwards.h" .



  • Stimmt! Danke


Anmelden zum Antworten