我有仿函数,如下所示:
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:也欢迎替代解决方案。
答案 0 :(得分:1)
关于问题1)您可以使用boost::ref C ++ 11 std::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),如果你不能通过非const引用,最好通过值传递并避免自己做一个临时的:
Object operator(Object obj) const
{
compute(obj);
return obj;
}
这允许编译器执行复制省略并且可以减少复制。有关详细信息,请参阅this article。