2010-06-22 48 views
5

<更新>和往常一樣,這個問題是錯誤的。實際的問題是:爲什麼transform_iterator不使用傳統的result_of功能來確定返回類型,而不是直接訪問UnaryFunc :: result_type。用解決方法發佈答案。 < /更新>如何在boost :: transform_iterator中使用phoenix表達式?

具體而言,是有一種方法,使一鳳表達露出result_type類型作爲預期的標準:: 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; 
} 

錯誤消息從編譯這樣做的relavent部分(GCC 4.3.4,提高1.43):

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

我有與boost :: lambda相同的問題(缺少result_type)。我以爲我以前看過make_transform_iterator和lambda的類似用法,現在我想知道我是否只是想象它。

有沒有提供包裝或其他機制在鳳凰或lambda暴露result_type

回答

4

看起來像這樣在boost trunk(參見第51行,result_of<>而不是間接UnaryFunc::result_type)中修復。所以這不應該是1.44以上的問題。

這是一個解決方法,用於提升< 1.44。僅當未提供Reference模板參數時,transform_iterator實例纔會訪問UnaryFunc::result_type。所以一個技巧是用一個版本替換make_transform_iterator,該版本調用UnaryFunc上的result_of元函數,並將結果用於參考模板參數。

#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); 
}; 
相關問題