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.
    }
 }

functor は次のように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);

上記のコードに関して 2 つの質問があります。

1) Functor は値によって iterator に渡されます。したがって、次のコードを使用しても、ファンクターから値を引き出すことができません。

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 に答える