发新话题
打印

关于function object

关于function object

在Essential C++ 中的P186页看到以下一段代码:
template< typename elemType, typename Comp = less<elemType> >
class LessThanPred {
public:
   LessThanPred( const elemType &val ) : _val( val ){ }
   bool operator() ( const elemType &val )
   {
    return Comp(val, _val);
   }
  void val ( const elemType &newval ) { _val = newval; }
  elemType val() const { return _val ; }
private:
  elemType _val;
};
我觉得其中的 Comp( val, _val )好像有问题,它明明是一个class,
并不是一个对象。在缺省情况下,它是stl所提供的function object
:less,它的意思好像是这样就可以调用Comp的operator(),可以这样做吗?
  我认为应该把operator( )改为以下代码:
  Comp comp ;   
  return comp( val, _val );
不知道这样改有没有道理,请指教。      

TOP

从生存期的角度,你这样改是错误的。      

TOP

你的想法是对的,这段代码确实有错误
但是你的改法有效率问题,这样就生成了一个object然后再返回,没这个必要
直接这样修改:
bool operator() ( const elemType &val )
{
return Comp()(val, _val);
}      
-----------------------------------------
http://www.darkspy.org/blog

自大的人把宗教当迷信,无知的人把迷信当宗教

TOP

感谢两位的回答。  
  我觉得在我修改过的bool operator() ( const elemType &val )版本中的那个对象comp,是local object,那么函数operator()一执行完它就不存在了。我没有返回该对象的引用或地址,那么应该没有生存期的错误。
  关于版主的修改,我觉得是个很简洁而且不错的方法。我想知道的是其中的“return Comp()(val, _val);“是不是相当于生成了一个匿名的Comp类型的
object,然后又调用了Comp的member function perator()。
  以上是我的一些想法,希望可以得到大家的指点。      

TOP

嗯,确实是。      

TOP

发新话题