templates mit zirkulärer Abhängigkeit



  • Ich versuch' grad folgendes:

    Ich habe einen Satz von Funktoren

    struct isX { bool operator()(char c) { ... }  }
    struct isY { bool operator()(char c) { ... }  }
    

    Die will ich mit &&, || und ! zu neuen Funktoren zusammenbauen:

    template <typename A, typename B>
    struct is_AND
    {
       A a; B b;
       is_AND(A a_, B b_) : a(a_), b(b_) {}
       bool operator()(char c) { return a(c) && b(c); }
    }
    

    Soweit funktioniert noch alles.
    Mein Problem:

    Wie definiere ich jetzt die überladenen Operatoren?
    Ich hab folgendes versucht:

    template <typename Derived>
    struct is_Logical
    {
       is_NOT<Derived> operator!() 
       { return is_NOT<Derived>( *static_cast<Derived *>(this)); }
    
       template <typename RHS>
       is_AND<Derived, RHS> operator && (RHS rhs) const 
       { return is_AND<Derived, RHS>(*static_cast<Derived *>(this), rhs); }
    
       template <typename RHS>
       is_OR<Derived, RHS> operator || (RHS rhs) 
       { return is_OR<Derived, RHS>(*static_cast<Derived *>(this), rhs); }
    };
    

    und leite die isX davon ab:

    struct isX : public is_Logical<isX>
    {
      bool operator isX()(char c) { ... }
    }
    

    Das klappt zwar auf der ersten Stufe ( (isX() && isY() ) - aber dem Ergebnis is_AND<isX, isY> fehlen natürlich die operatoren, also z.B. (!isX() && !isY()) funktioniert nicht.

    Wie pack' ich die da rein?

    :grübel:



  • Hast du schon versucht, is_AND von isLogical (btw, ziemlich verwirrende Namen) abzuleiten? Vorwärtsdeklarationen gibts auch für Templates:

    template <typename Derived>
    struct isLogical;
    
    template <typename A, typename B>
    struct is_AND : public isLogical<is_AND<A,B> >
    {
       A a; B b;
       is_AND(A a_, B b_) : a(a_), b(b_) {}
       bool operator()(char c) { return a(c) && b(c); }
    };
    


  • klappt 🙂
    Hatte ich gar nicht erst versucht, weil forward für eine "normale" Basisklasse ja nicht reicht. Danke!

    btw, ziemlich verwirrende Namen

    Sorry, das origonal ist noch schlimmer 🙂 War halt so 'ne fixe Idee, ich wollte aber erst aufräumen wenn ich es wirklich zum laufen bekkomme


Anmelden zum Antworten