0

我有仿函数,如下所示:

 struct Functor{
    //Global statistics for all objects seen;

    Statistics stats;

    Object operator( const Object & obj) const
    {
          //Copy Object
          Object tmp = obj;
          compute(tmp);
          return tmp;
    }


    void compute( Object & obj );
       //Compute on Object & store in Object 
       :
       :
       stats += obj; <---compute stats about the object itself.
    }
 }

函子以下列方式与boost::transform_iterator一起使用:

SomeDataStructure ds;

boost::transform_iterator< Functor, SomeDataStructure::iterator  > iBegin,iEnd;

iBegin = boost::make_transform_iterator( ds.begin(),Functor() );
iEnd   = boost::make_transform_iterator( ds.end(),Functor() );

AnotherMethod(iBegin,iEnd);

关于上面的代码,我有两个问题:

1) Functor 按值传递给迭代器。因此,即使我使用以下代码,我也无法从仿函数中提取任何值:

iBegin.functor().stats;

有没有更好的方法来做到这一点?

2) 函子通常填充 Object 类型的不完整对象。即计算对象的属性并将其存储回对象中。operator() 需要一个来自 transform_iterator 类内部的 const 对象。目前,我制作了对象的副本并填充并返回它。我想摆脱这个不必要的副本,那么有什么办法吗?

PS:也欢迎替代解决方案。

4

1 回答 1

1

关于问题 1)您可以使用C++11 std::ref的boost:: ref 。

boost::transform_iterator< std::reference_wrapper<Functor>, 
                           SomeDataStructure::iterator  > iBegin,iEnd;

auto myFunctor = std::ref(Functor());
iBegin = boost::make_transform_iterator( ds.begin(), myFunctor );
iEnd   = boost::make_transform_iterator( ds.end(), myFunctor );

关于2),如果你不能通过非常量引用传递,最好是通过值传递,避免自己做一个临时的:

Object operator(Object obj) const
{
      compute(obj);
      return obj;
}

这允许编译器执行复制省略并可能导致更少的复制。有关更多信息,请参阅本文

于 2012-08-01T07:43:10.487 回答