Generischer Attributname?



  • Ich habe kaum hoffnung, dass dies gehen wird.
    Ich habe Datentypen, die so ähnlich aussehen

    class A
    {
    protected:
      vector<Foo> _foo;
    };
    
    class B
    {
    protected:
     vector<Foo> _foo;
     vector<Foo> _xy;
    };
    

    Dh ich habe viele Klassenn die A, B, C usw heißen und intern oft vector vom Typ Foo haben, diese können mehrmals pro Klasse auftauchen, aber anders heißen, wie in Klasse B gezeigt.

    Nun suche ich nach einem Weg, in einer Methode so generisch wie möglich mit den vector<Foo> arbeiten zu können. sprich push usw.

    Diese Möglichkeit hier habe ich leider nicht

    void tuwas(vector<Foo> & f, ...);
    

    Die Referenz der vector kann ich aus einer Reihe von programminternen Gründen nicht übergeben.

    Was ich kann, ist so etwas

    template<class T> void tuwas(T & t, ...)
    {
      t._foo.push_back(...);
    }
    

    Der Haken ist, diese Methode klappt so problemlos, ich bekomme die Referenzen der Klassen problemlos, nur ist dies auf nur _foo beschränkt, möchte ich ein weiteres Element wie _xy, brauch ich eine weitere Methode, was ungünstig ist.

    Gibt es da einen Weg?
    Was ich eigentlich Suche, aber dessen Existens bezweifele ist so etwas:

    template<class T> void tuwas(T & t, const string & magic, ...)
    {
      t.[[[magic]]].push_back(...);
    }
    


  • typedef std::vector<Foo> FooVec;
    typedef std::map<std::string, FooVec > VecMap
    
    class A
    {
    protected:
      const vecMap map_; //fuehrende unterstriche wuerde ich vermeiden
    public:
      A() : map_(boost::assign::list_of("foo_", FooVec) )
      {}
    };
    
    class B
    {
    protected:
      const vecMap map_; //fuehrende unterstriche wuerde ich vermeiden
    public:
      A() : map_(boost::assign::list_of("foo_", FooVec)("xy_",FooVec) )
      {}
    };
    
    template<class T> void tuwas(T & t, const string & magic, ...)
    {
      t.map_[magic].push_back(...);
    }
    

    Aber: Was auch immer das für "programminterne Gründe" sein mögen, irgendwie musst du deine Funktion tuwas() an die vector'en dranlassen. Evtl. auch mit Vererbung:

    template <unsigned int N>
    class FooVecHolder
    {
    private: //oder protected wenn erbende Klassen direkten Zugriff haben sollen
      FooVec fw_[N];
    public:
      void tuwas(unsigned int n, ...)
      { 
        assert(n < N);
        fw_[n].push_back(...); 
      }
    };
    
    class A : public FooVecHolder<1>
    {};
    
    class B : public FooVecHolder<2>
    {};
    

    stellt sich immernoch die Frage wozu das alles....


  • Administrator

    template<typename ObjT, typename VarT>
    void foo(ObjT& obj, VarT var)
    {
      (obj.*var).push_back(...);
    };
    
    // Verwendung:
    class Test
    {
    public:
      std::vector<Foo> m_vec;
    };
    
    // ...
    Test obj;
    foo(obj, &Test::m_vec);
    

    So würde ich das allenfalls machen. Hoffe ich habe dein Problem richtig verstanden 😉

    Grüssli



  • Dravere schrieb:

    template<typename ObjT, typename VarT>
    void foo(ObjT& obj, VarT var)
    {
      (obj.*var).push_back(...);
    };
    
    // Verwendung:
    class Test
    {
    public:
      std::vector<Foo> m_vec;
    };
    
    // ...
    Test obj;
    foo(obj, &Test::m_vec);
    

    So würde ich das allenfalls machen. Hoffe ich habe dein Problem richtig verstanden 😉

    Grüssli

    Dragvere, mein vector ist protected, daher wird das so nicht klappen. Und btw welcher Typ ist dann VarT?

    pumukl, guck ich mir morgen an, obwohl ich hier auf boost verzichten wollten



  • Kann jemand anderes bestätigen dass Draveres Lösung für protected nicht klappt? Ich bin mir nich sicher, ob es bei mir wegen protected oder syntax nicht klappt...



  • Versteh' mich jetzt nicht falsch, dass ist auf keinen Fall böse gemeint. Eher ist als als gutgemeinter Rat gedacht. Oder als Versuch, Deine bisherigen Posts hier mal zu analysieren.
    Nun mal auf den Punkt gekommen:
    Ich habe oft den Eindruck, dass Du versuchst, eigentlich einfache Sachverhalte mit extrem komplizierten und komplexen Lösungen zu behandeln. Meisst ist es eine wirklich schlechte Idee. Besser ist es, einfache Lösungen zu finden, die auf das Problem abzielen. Man sollte dabei im Design so viel Spielraum lassen, dass Änderungen möglich sind, aber eierlegende Wollmilchsäue sollte man dabei besser nicht kreieren. Das geht meist entweder nach hinten los, oder kostet imens viel Zeit.



  • Ich fasse das nicht negativ auf.

    Allerdings muss ich mit vorhandenem 15 Jahre alten C Code arbeiten, den ich bei leibe nicht anfassen darf.
    Und da ich den Stamm nicht anfassen darf, werden die Lösungen nach oben hin immer komplezierter und immer ein Gefrickel bleiben. Das ist Tatsache, das haben mir schon mehrere Leute aus mehreren Abteilungen gesagt.


  • Administrator

    Seikilos schrieb:

    Kann jemand anderes bestätigen dass Draveres Lösung für protected nicht klappt? Ich bin mir nich sicher, ob es bei mir wegen protected oder syntax nicht klappt...

    Nein geht nicht, ich hatte etwas verwechselt, ich benutze dies normalerweise in einem anderen Kontext. Ganz vergessen, dass es von ausserhalb der Klasse gar nicht funktioniert.

    Ich habe mir deshalb jetzt auch nochmals deine Frage gelesen und muss sagen, irgendwie hat es für mich ein paar Widersprüche darin, auch mit späteren Aussagen von dir.

    Seikilos schrieb:

    Diese Möglichkeit hier habe ich leider nicht

    void tuwas(vector<Foo> & f, ...);
    

    Die Referenz der vector kann ich aus einer Reihe von programminternen Gründen nicht übergeben.

    Was für Gründe? Anscheinend kannst du das Objekt, in welchem der Vektor ist, weitergeben, wieso kannst du dann nicht den Vektor direkt weitergeben?

    Seikilos schrieb:

    Was ich kann, ist so etwas

    template<class T> void tuwas(T & t, ...)
    {
      t._foo.push_back(...);
    }
    

    Der Haken ist, diese Methode klappt so problemlos, ich bekomme die Referenzen der Klassen problemlos, nur ist dies auf nur _foo beschränkt, möchte ich ein weiteres Element wie _xy, brauch ich eine weitere Methode, was ungünstig ist.

    Ich dachte _foo sei protected??? Und wenn du so problemlos an die Referenzen kommst, dann geht doch die erste Methode, welche du irgendwie ausschliesst, problemlos.

    Seikilos schrieb:

    Allerdings muss ich mit vorhandenem 15 Jahre alten C Code arbeiten, den ich bei leibe nicht anfassen darf.
    Und da ich den Stamm nicht anfassen darf, werden die Lösungen nach oben hin immer komplezierter und immer ein Gefrickel bleiben. Das ist Tatsache, das haben mir schon mehrere Leute aus mehreren Abteilungen gesagt.

    Das versteh ich auch nicht. Es ist normalerweise so, dass die Schnittstelle zwischen dem C++ Code und dem C Code ein wenig ein Gefrickel wird, aber der C++ Code sollte deswegen keinen Schaden nehmen, was bei dir aber der Fall zu sein scheint.

    Kannst du das Problem vielleicht einmal etwas genauer umschreiben? Also noch ein paar zusätzliche Informationen zu der Umgebung und was du erreichen möchtest.

    Grüssli


Anmelden zum Antworten