2013-06-23 3 views
5

Gibt es eine Möglichkeit, dies (ohne Makros) zu trocknen?DRY up-Code, der nur in const unterscheidet

void clear_tp_vec(vector<const Tk*>& tps){ 
    for(auto it=tps.begin();it!=tps.end();++it){ 
     const ValT* vp=dynamic_cast<const ValT*>(*it); 
     if(vp!=NULL) 
      delete vp; 
    } 
    tps.clear(); 
}; 

void clear_tp_vec(vector<Tk*>& tps){ 
    for(auto it=tps.begin();it!=tps.end();++it){ 
     ValT* vp=dynamic_cast<ValT*>(*it); 
     if(vp!=NULL) 
      delete vp; 
    } 
    tps.clear(); 
}; 

Das einzige, was die zweite Überlast in sich unterscheidet, ist die const Qualifier (das Fehlen davon). Das Auskommentieren einer der beiden Versionen unterbricht meinen Code.

+3

Definieren Sie es als Vorlage. – cup

+1

Die for-Schleife könnte kürzer sein: for (auto it = tps.begin(); it! = Tps.end(); ++ it) löschen dynamic_cast (* it); – user1764961

+0

Danke. Ich wusste nicht, dass ich nullptrs löschen könnte. – PSkocik

Antwort

0

Kommentare (@ Cup „es eine Vorlage machen“, @ user1764961 der NULL-Test „des loswerden“) haben dazu geführt, Ich auf die folgende, sehr offensichtliche, modifizierte Version:

template<typename T> 
void clear_tp_vec(vector<T>& tps) { 
     for(auto it=tps.begin(); it!=tps.end(); ++it) 
      delete dynamic_cast<const ValT*>(*it); 
     tps.clear(); 
} 
+0

Wenn ihr die Standard-Antwort-Punkte wollt, möge euer Spitzname @cup oder @ user1764961 sein und eure Antwort sei diese oder gleichwertig, oder noch besser, seid jeder und verbessert dies, so dass es nur für Tk * 'const Tk instanziiert * '. Bitte keinen Boost (nur C++ (C++ 11 ist OK, da der Code es offensichtlich schon benutzt). – PSkocik

0

Sie können folgende Template-Funktion verwenden:

template < typename T > 
void clear_tp_vec(vector< T* >& tps) 
{ 
    typedef typename conditional< is_const<T>::value, const ValT, ValT >::type OUT; 
    for (auto it = tps.begin(); it != tps.end(); ++it) 
    { 
     OUT* vp = dynamic_cast< OUT* >(*it); 
     if (vp != NULL) 
      delete vp; 
    } 
    tps.clear(); 
}; 
0

können Sie auf NULL-Werte löschen rufen so Test nicht benötigt wird. Auch sollten Sie Standard-Algorithmen für Iteratoren verwenden, nicht selbst iterieren.

Sie können Boost.Lambda verwenden, um etwas sehr allgemein hier mit Platzhalter schreiben:

#include <boost/lambda/bind.hpp> 
#include <boost/lambda/lambda.hpp> 
... 
using namespace boost::lambda; 
std::for_each(tps.begin(), tps.end(), bind(std::ptr_fun(operator delete), *_1));