有没有办法干掉它(没有宏)?
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 限定符(缺少它)。评论任何一个版本都会破坏我的代码。
答案 0 :(得分: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();
};
答案 1 :(得分: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));
答案 2 :(得分: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();
}