<更新>いつものように、質問は間違っていました。実際の問題は、なぜ 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
ますか?