Designproblem: Variable Basisklasse



  • Ich wollte in meinem Framework dem Spieler ermöglichen eigene Subklassen von bisher verwendeten einheiten zu erstellen. Dann könnte er den Einheiten z.B. als Templateargument die neue Basisklasse übergeben. Aber da könnte man ja jeden Schwachsinn als Templateparameter übergeben. Also will ichs so einschränken, dass nur Subklasssen der eigentlichen Basisklasse als Basis verwendet werden können. Ich wollte dafür Traits benutzen, hab aber noch keine Idee.

    Weis jemand Rat?

    thx im Voraus



  • Hallo,
    mal was ungetestetes:

    template <class D, class B>
    struct IsDerivedFrom
    {
    static char test(B*);
    static char(& test(...))[2];
    enum {value = sizeof(test(static_cast<D*>(0))) == 1};
    };
    
    class Bar {};
    
    template <class T>
    class Foo
    {
    public:
         typedef int T_MUST_BE_DERIVED_FROM_BAR[IsDerivedFrom<T, Bar>::value];
    
    };
    
    class Der : public Bar
    {};
    
    int main()
    {
        Foo<Der> f1;
        Foo<int> f2; // Fehler;
    
    }
    


  • @HumeSikkins
    warum so viel mühe, wenn es doch Boost gibt

    #include <boost/type_traits.hpp>
    #include <boost/static_assert.hpp>
    
    struct Unit { virtual ~Unit() { } };
    
    class MegaUnit : public Unit { };
    
    template<class T>
    class Moppelkotze {
      BOOST_STATIC_ASSERT( (::boost::is_base_and_derived<Unit,T>::value) );
    public:
      Moppelkotze() { }
    };
    
    int main() {
      Moppelkotze<MegaUnit> m1;
      Moppelkotze<int> m2; //<-- ups
    }
    


  • @Hume: sieht gut aus, aber ich denke, dass die Boost Varainte weniger aufwendig ist, ich werds mal versuchen

    Danke



  • du willst dem spieler wirklich den sourcecode in die hand drücken?



  • Nein, ich wollte ein SDK schreiben, in dem jeder Spieler schnell eigene Rassen und Einheiten einfügen kann. Es soll dann auch, wie von dir Vorgeschlagen, die Einheitengenerierung aus Dateien möglich sein, am XML-Standard arbeite ich noch.



  • kingruedi schrieb:

    @HumeSikkins
    warum so viel mühe, wenn es doch Boost gibt

    Warum nicht Loki::SuperSubclassStrict? Ganz einfach: ich dachte es wäre vielleicht hilfreich zu sehen, wie sowas implementiert werden kann. Meine Lösung ist ja bei weitem nicht perfekt, aber imo doch ein guter Denkanstoß.

    Ein Hinweis auf boost hätte meinem Beitrag zugegebenermaßen aber sicher gut getan. Habe ich in meiner Eile schlicht vergessen 😞


Log in to reply