5

有没有办法把它干掉(没有宏)?

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

第二个重载唯一不同的是const限定符(缺少它)。注释掉任何一个版本都会破坏我的代码。

4

3 回答 3

0

您可以对空值调用 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 回答
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 回答