调用CGAL的max_distance_to_triangle_mesh时make_range参数构造报错
CGAL
max_distance_to_triangle_mesh 点范围参数构造编译错误解决 问题描述
使用CGAL库提供的max_distance_to_triangle_mesh函数时,第一个参数要求传入点类型的范围,多次尝试构造该参数均失败。
现有代码框架如下,替换????位置的内容多次均无法通过编译:
std::vector<Point> pts = ......; double dist = PMP::max_distance_to_triangle_mesh( CGAL::make_range( boost::make_transform_iterator( pts.begin(), ???? ), boost::make_transform_iterator( pts.end(), ???? ) ), mesh );
目前仅找到一个相关示例,示例中存储的点为pair类型,????位置的转换函数通过Property_map_to_unary_function构造,尝试传入恒等函数未解决问题。
曾尝试编写如下lambda表达式作为转换函数:
auto get_pt = [](const Point &pt) { return pt; };
将????替换为&get_pt后,编译过程中boost库抛出 no type named 'type' 错误。
解决方案
最简写法(推荐)
如果pts向量存储的元素本身就是Point类型,完全不需要额外套boost::make_transform_iterator做无意义的转换,直接传入向量的原生迭代器构造范围即可:
std::vector<Point> pts = ......; double dist = PMP::max_distance_to_triangle_mesh( CGAL::make_range(pts.begin(), pts.end()), mesh );
需要自定义转换的场景
如果存储的元素不是纯Point类型、必须做转换,不要自行编写裸lambda,使用CGAL内置的恒等函数对象替换????位置即可:
std::vector<Point> pts = ......; double dist = PMP::max_distance_to_triangle_mesh( CGAL::make_range( boost::make_transform_iterator( pts.begin(), CGAL::Identity_functor<Point>() ), boost::make_transform_iterator( pts.end(), CGAL::Identity_functor<Point>() ) ), mesh );
之前lambda写法报错的核心原因:boost::make_transform_iterator依赖boost的result_of机制推导可调用对象的返回值,自行编写的lambda取地址传入后,该机制无法正确推导返回类型,就会抛出*no type named 'type'*的编译错误。
内容的提问来源于stack exchange,提问作者Stéphane Laurent
相关产品推荐
相关产品推荐

