干掉只有const不同的代码

时间:2013-06-23 08:10:35

标签: c++ const 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();
};

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

3 个答案:

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