5

<更新>いつものように、質問は間違っていました。実際の問題は、なぜ transform_iterator が UnaryFunc::result_type に直接アクセスする代わりに、従来の result_of<> メタ関数を使用して戻り値の型を決定しないのかということです。回避策を含む回答を投稿しました。 </アップデート>

具体的には、フェニックス式result_typeで std::unary_function の概念に期待される型を公開する方法はありますか? boost::transform_iterator はこれを期待しているようで、その src を見ると、単純な回避策は見当たりません。

私が抱えていた問題を再現するコードは次のとおりです。

#include <boost/iterator/transform_iterator.hpp>
#include <boost/spirit/home/phoenix.hpp>
#include <numeric>
#include <iostream>

using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;

int main(void){
   int i[] = {4,2,5,3};

   std::cout <<
      std::accumulate(
         boost::make_transform_iterator(i,   _1*_1),
         boost::make_transform_iterator(i+4, _1*_1),
         0
      ) << std::endl;

   return 0;
}

これをコンパイルしたときのエラー メッセージの関連部分は次のとおりです (gcc 4.3.4、boost 1.43):

/usr/include/boost/iterator/transform_iterator.hpp:43: error: no type named ‘result_type’ in ‘struct boost::phoenix::actor<...

boost::lambda (missing result_type) にも同じ問題があります。過去に make_transform_iterator と lambda の同様の使用法を見たことがあると思っていましたが、今は想像しただけでしょうか。

提供されたラッパーまたはフェニックスまたはラムダに公開する他のメカニズムはありresult_typeますか?

4

1 に答える 1

4

これはブースト トランクresult_of<>で修正されているようです (間接ではなく、51 行目を参照UnaryFunc::result_type)。したがって、これは 1.44 以降では問題になりません。

ブースト < 1.44 の回避策は次のとおりです。transform_iterator のインスタンス化は、テンプレート パラメーターが指定されていないUnaryFunc::result_type場合にのみアクセスします。Referenceしたがって、1 つのトリックは、make_transform_iterator を、UnaryFunc で result_of<> メタ関数を呼び出すバージョンに置き換え、その結果を Reference テンプレート パラメーターに使用することです。

#include <boost/iterator/transform_iterator.hpp>
#include <boost/utility.hpp>
#include <iterator>

template <class UnaryFunc, class Iterator>
boost::transform_iterator<
   UnaryFunc,
   Iterator,
   typename boost::result_of<
      UnaryFunc(typename std::iterator_traits<Iterator>::value_type)
   >::type
>
make_trans_it(Iterator it, UnaryFunc fun){
   return
      boost::transform_iterator<
         UnaryFunc,
         Iterator,
         typename boost::result_of<
            UnaryFunc(typename std::iterator_traits<Iterator>::value_type)
         >::type
      >(it, fun);
};
于 2010-06-22T18:53:05.273 に答える