Konditionelle Vererbung



  • Geplant ist folgendes: Der Benutzer einer Klasse soll angeben können, ob die Klasse eine benötigte Funktionalität hat oder nicht.

    Wie krieg ich das hin?

    Nebenbedingungen:
    - Muss zur Compile-Zeit auswählbar sein.
    - Die Auswahl der Funktionalität sollte implizit in Abhängigkeit eines Templateparameters von Foo erfolgen, sodass der Benutzer nicht noch einen extra Template-Parameter angeben muss, der nur als Schalter dient. Also anstatt template<class U, bool schalter> class Foo nur template<class U> class Foo
    - Die Funktionalität ist abhängig von zwei weiteren Templateparametern der Klasse.

    In etwa so:

    // 1.
    template <typename U, typename V>
    struct Funktionalitaet
    {
       void blub(const V& fau) 
       {
          //mach irgendwas
          machIrgendwasMitU();
       }
    };
    
    //2.
    struct Funktionalitaet
    {
      //Hier ist wirklich nichts
    };
    
    template <typename U, typename V>
    class Foo /* Hier gehört in Abhängigkeit von U entweder : public Funktionalitaet<U,V> oder : public Funktionalitaet hin */
    {
       //...
    };
    

    Foo hat hierbei mehrere solcher Konfigurationen (mehrere optionale Funktionalitäten). 1. und 2. müssen nicht die selbe Klasse sein (mir kam nur irgendwie in den Sinn, dass das mit Spezialisierung irgendwie hinzubekommen ist).

    Wenn ich jetzt irgendwie hinbekommen würde, dass Foo von 2. erbt, wenn U ein bestimmter Typ (nennen wir ihn 😵 ist, und von 1. erbt wenn U alles außer X ist, dann hätte ich den gewünschten Effekt erreicht.

    Geht das und wenn ja, wie?



  • template <bool, typename T, typename>
    struct select
    {
        typedef T type;
    };
    
    template <typename T, typename U>
    struct select<false, T, U>
    {
        typedef U type;
    };
    
    template <typename U, typename V>
    class Foo
        : public typename select
        <
            std::is_same<U, X>::value, // #include <type_traits> (C++ 11)
            Funktionalität<U, V>,
            Funktionalität
        >::type
    {
        ...
    };
    

    Edit: select gibts in C++11 offenbar auch schon als std::conditional.



  • Perfekt! Danke.


Anmelden zum Antworten