5

これを(マクロなしで)DRYする方法はありますか?

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

2 番目のオーバーロードが異なる唯一の点は、const修飾子 (その欠如) です。どちらかのバージョンをコメントアウトすると、コードが壊れます。

4

3 に答える 3

0

次のテンプレート関数を使用できます。

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();
};
于 2013-06-25T07:40:59.190 に答える
0

コメント (@cup の「テンプレートにする」、@ user1764961 の「NULL テストを取り除く」) により、次の非常に明白な変更バージョンにたどり着きました。

 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();
 }
于 2013-06-25T09:43:54.747 に答える
0

null 値に対して delete を呼び出すことができるので、テストは必要ありません。また、自分自身を反復するのではなく、反復子で標準アルゴリズムを使用する必要があります。

Boost.Lambda を使用して、プレースホルダーを使用して非常に一般的なものをここに記述できます。

#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));
于 2013-06-25T08:02:36.373 に答える