[multi_index] custom template class for handle multi_index map
hi, i'm a newbie to boost an templates. but for my interrest i experimentalise with that. so i created an example like the following: =============================================================================================== template<typename MAP, typename ELM, typename SC1, typename IT1> class tCanMap { protected: mutable MAP _mpMap; // map mutable SC1 *_scNme; // sorting criteria name ... have to init from derived class public: tCanMap (); MAP &getmap () const; UINT32 setmapelm (ELM val); const ELM *getmapelm (STRING stNme) const; }; template<typename MAP, typename ELM, typename SC1, typename IT1> tCanMap<MAP,ELM,SC1,IT1>::tCanMap() { this->_scNme = NULL; } template<typename MAP, typename ELM, typename SC1, typename IT1> MAP &tCanMap<MAP,ELM,SC1,IT1>::getmap() const { return this->_mpMap; } template<typename MAP, typename ELM, typename SC1, typename IT1> UINT32 tCanMap<MAP,ELM,SC1,IT1>::setmapelm(ELM val) { if (this!=NULL) { this->_mpMap.insert(val); return 0; } return 1; } template<typename MAP, typename ELM, typename SC1, typename IT1> const ELM *tCanMap<MAP,ELM,SC1,IT1>::getmapelm(STRING stNme) const { try { if ( this!=NULL && this->_scNme!=NULL ) { IT1 itr = this->_scNme->find(stNme); if ( itr != this->_scNme->end() ) { return &(*itr); } } } catch(...) {} return NULL; } =============================================================================================== cClass00 { STRING nme; cClass00() {}; STRING getnme() { return this->nme; } } typedef boost::multi_index_container < cClass00, boost::multi_index::indexed_by < boost::multi_index::hashed_unique < BOOST_MULTI_INDEX_CONST_MEM_FUN(cClass00,STRING,getnme) >
mClass00;
typedef mClass00::nth_index<0>::type mClass00ByNme; typedef mClass00ByNme::iterator mClass00ByNmeItr; =============================================================================================== cClass01 : public tCanMap<mClass00,cClass00,mClass00ByNme,mClass00ByNmeItr> { STRING nme; cClass01() { this->_scNme = &(this->_mpMap.get<0>()); } STRING getnme() { return this->nme; } } typedef boost::multi_index_container < cClass01, boost::multi_index::indexed_by < boost::multi_index::hashed_unique < BOOST_MULTI_INDEX_CONST_MEM_FUN(cClass01,STRING,getnme) >
mClass01;
typedef mClass01::nth_index<0>::type mClass01ByNme; typedef mClass01ByNme::iterator mClass01ByNmeItr; =============================================================================================== cClass02 : public tCanMap<mClass01,cClass01,mClass01ByNme,mClass01ByNmeItr> { cClass02() { this->_scNme = &(this->_mpMap.get<0>()); } ... } =============================================================================================== int main (void) { cClass02 *ptClass02 = new cClass02(); ptClass02->fill_maps_with_elements(); ptClass02->getmapelm("cClass01_Element")->dosomething(); // this works ptClass02->getmapelm("cClass01_Element")->getmapelm("cClass00_Element")->dosomething(); // seg vault !!! ... } =============================================================================================== could you explain why the second try of using "getmapelm" results in an error? is there a better way to use a template class like above for handle a multi_index list as a member in similarly classes, whose objects should describe a hierarchical structure? (note: list shall have multiple indizes :o) i use boost 1.34.1 and gcc 3.4.5 (mingw special). many thanx daniel _____________________________________________________________________ Der WEB.DE SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen! http://smartsurfer.web.de/?mc=100071&distributionid=000000000066
participants (1)
-
damny@web.de