aca*_*bot 5 c++ boost boost-lambda boost-phoenix
<更新>像我一样,问题是错误的.实际问题是:为什么transform_iterator不使用传统的result_of <>元函数来确定返回类型,而不是直接访问UnaryFunc :: result_type.通过解决方案发表答案. </更新>
具体来说,有没有办法让phoenix表达式暴露出result_typestd :: 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;
}
Run Code Online (Sandbox Code Playgroud)
编译它的错误消息的相关部分是(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<...
Run Code Online (Sandbox Code Playgroud)
我对boost :: lambda(缺失result_type)有同样的问题.我以为我过去看过make_transform_iterator和lambda的类似用法,现在我想知道我是不是想象它.
是否有一个提供的包装器或凤凰或lambda中的其他机制来暴露result_type?
看起来这是固定在boost trunk中的(参见第 51 行,result_of<>而不是间接的UnaryFunc::result_type)。所以这在 1.44 及更高版本中不应该是问题。
这是 boost < 1.44 的解决方法。UnaryFunc::result_type仅当Reference未提供模板参数时, transform_iterator 实例化才会访问。因此,一个技巧是将 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);
};
Run Code Online (Sandbox Code Playgroud)