generelle Frage: STL-Container anpassen



  • Ich will hier ab und zu einen STL-Container anpassen (Im Moment brauche ich gerade eine map mit speziellem reverse lookup), und steh' vor einem Problem:

    (1) wenn ich einfach vom Original-Container (public) ableite, sind Methoden öffentlich sichtbar, die nicht mehr "richtig" sind
    (2) wenn ich den Original-Container kapsele, muß ich so schrecklich viel Boilerplate Code schreiben (selbst wenn ich nur das nötigste nach draußen lege): begin, end, iterator, const_iterator, value type usw. (von reverse iterator gar nicht erst zu reden)
    (3) protected / private inheritance bringt auch nicht viel

    Wie macht ihr das?



  • lohnt sich das ableiten überhaupt, wenn du ohnehin soviel neu schreiben musst ?

    Oder wie wärs mit einem Adapter, der einfach nur einen pointer auf eine map bekommt,
    und dann deine Funktionalität implementiert ?

    Devil



  • wenn du ohnehin soviel neu schreiben musst

    muß ich ja nicht, insert und erase/remove ändern sich, und eine find_reverse - methode kommt dazu.

    Wenn ich private ableite (oder aus der "normalen" map einen member mache), muß ich ne Menge wieder zugänglich machen. Ich will ja möglichst viel behalten: iteration, size, usw. Ist auf alle Fälle die "sichere Variante", nur habe ich das Problem regelmäßig, und irgendwie nervt mich die Tipperei.

    Weniger Arbeit hab' ich natürlich mit public inheritance und einem Kommentar wie "add / remove items only with these functions, or you are fired!"

    Oder wie wärs mit einem Adapter, der einfach nur einen pointer auf eine map bekommt

    Ich will das Teil schon richtig als eine Klasse gekapselt haben.



  • Die Container sind aus performancegründen nicht ableitbar, es gibt keine einizige vituelle Methode, ergo funktioniert ableiten nicht (bzw. nicht korrekt). Du solltest es private ableiten und mittels using die Methoden zugreifbar machen.

    class my_vector : private vector<T>
    {
    public:
        using vector<T>::size;
    };
    

    So müsste es gehen...



  • using vector<T>::size;

    Das ist ja hübsch 🙂

    Ist zwar immer noch ein ganz schöner Klopper, aber schon fast autotextfähig...

    typedef std::map<int, mxhlist> base;
    public:
        using base::iterator;
        using base::reference;
        using base::const_iterator;
        using base::const_reference;
        using base::empty;
        using base::size;
    
        using base::begin;
        using base::end;
    

Anmelden zum Antworten