000
04.10.2005, 21:56 Uhr
Spacelord
Hoffnungsloser Fall
|
Hallo, wie handhabt ihr es wenn ihr einen Container(liste,vector oder was auch immer) mit shared_ptr Instanzen habt und STL Algorithmen nutzen wollt? Ich meine die üblichen Adaptoren bringen einem ja nix weil der "Inhalt" des entsprechenden Iterators ja doppelt dereferenziert werden muss um an das eigentliche Objekt zu kommen. Die Standardalgorithmen führen aber nur eine einfache Dereferenzierung des Iterators durch. Da kommt also irgendein shared_ptr<T> bei raus anstatt T. Ich hab es jetzt so gelöst dass ich mir nen template geschrieben hab dass die zweite Dereferenzierung erledigt und damit den Functor füttert.
C++: |
template<class _functor> struct deref_shared_ptr:public std::unary_function< boost::shared_ptr<_functor::argument_type>, typename _functor::result_type> { public: deref_shared_ptr(_functor _f):_ft(_f){} inline result_type operator()(boost::shared_ptr<typename _functor::argument_type>& _p) { return _ft(*_p); } protected: _functor _ft; };
template <class _functor> inline deref_shared_ptr<_functor> dref(const _functor &_ft) { return deref_shared_ptr<_functor> (_ft); }
|
In der Anwendung sieht das Ganze dann etwa so aus:
C++: |
sequence::iterator sequence::find(const ordered_pair& op) { return std::find_if(_con.begin(),_con.end(),dref(std::bind2nd(std::equal_to<ordered_pair>(),op))); }
|
Lässt sich der gleiche Effekt auch eleganter erzielen? Oder habt ihr irgendwelche Verbesserungsvorschläge?
Da das was ist was wirklich wiederverwendbar ist,und ich nicht so der template Crack bin, bin ich für konstruktive Anregungen dankbar um das ganze in ne brauchbare Form zu bekommen.
MfG Spacelord -- .....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes. Dieser Post wurde am 04.10.2005 um 21:58 Uhr von Spacelord editiert. |