【问题标题】:How to use a phoenix expression with boost::transform_iterator?如何使用带有 boost::transform_iterator 的凤凰表达式?
【发布时间】:2010-06-22 04:29:28
【问题描述】:

像往常一样,这个问题是错误的。实际问题是:为什么transform_iterator 不使用常规的result_of 元函数来确定返回类型,而不是直接访问UnaryFunc::result_type。发布了解决方法的答案。 更新>

具体来说,有没有办法让 phoenix 表达式按照 std::unary_function 概念的预期暴露 result_type 类型? 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 有同样的问题(缺少 result_type)。我以为我在过去看到过 make_transform_iterator 和 lambda 的类似用法,现在我想知道是不是我想象出来的。

在 phoenix 或 lambda 中是否有提供的包装器或其他机制来暴露 result_type

【问题讨论】:

    标签: c++ boost boost-lambda boost-phoenix


    【解决方案1】:

    看起来这是在 boost trunk 中修复的(参见第 51 行,result_of&lt;&gt;,而不是间接的 UnaryFunc::result_type)。所以这不应该是 1.44 及更高版本的问题。

    这是 boost Reference 模板参数时,transform_iterator 实例化才会访问 UnaryFunc::result_type。因此,一个技巧是将 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);
    };
    

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 2011-07-11
      相关资源
      最近更新 更多