gpt4 book ai didi

c++ - 如何在 boost::transform_iterator 中使用 phoenix 表达式?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:02 24 4
gpt4 key购买 nike

和往常一样,这个问题是错误的。实际问题是:为什么 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

最佳答案

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

这是 boost < 1.44 的解决方法。 transform_iterator 实例化访问 UnaryFunc::result_type仅当 Reference未提供模板参数。因此,一个技巧是将 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);
};

关于c++ - 如何在 boost::transform_iterator 中使用 phoenix 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3090270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com