2013-06-23 9 views
5

Czy istnieje sposób DRY this (bez makr)?DRY up kod, który różni się tylko w stałej

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(); 
}; 

Jedyne drugi różni się przeciążenia jest const kwalifikator (jej brak). Komentowanie którejkolwiek wersji łamie mój kod.

+3

Zdefiniuj jako szablon. – cup

+1

Pętla for może być krótsza: for (auto it = tps.begin(); it! = Tps.end(); ++ it) delete dynamic_cast (* it); – user1764961

+0

Dzięki. Nie wiedziałem, że mogę usunąć nullptr. – PSkocik

Odpowiedz

0

Komentarze (@ kubek w „sprawiają, że szablon” @ user1764961 w „pozbyć się” null testu) doprowadziły do następującej, bardzo oczywistej, zmodyfikowanej wersji:

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

Jeśli chcesz mieć domyślne punkty odpowiedzi, może to być pseudonim @cup lub @ user1764961, a twoja odpowiedź powinna być taka lub podobna, lub jeszcze lepiej, być kimkolwiek i poprawić to tak, aby tworzyło tylko dla 'Tk *' 'const Tk * '. Bez doładowania proszę (tylko C++ (C++ 11 jest OK, ponieważ kod oczywiście już go używa). – PSkocik

0

można użyć następujących funkcji szablonu:

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

można zadzwonić usuwać na wartości null więc badanie nie jest potrzebne. Powinieneś także używać standardowych algorytmów na iteratorach, a nie iterować siebie.

Można użyć Boost.Lambda napisać coś bardzo ogólny tutaj używając zastępcze:

#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)); 
Powiązane problemy