我正在为我正在研究的Julia(1.x)项目评估CxxWrap。我对让我的CxxWrap代码返回一个类型的std :: vector感兴趣,并在Julia代码中遍历该向量感兴趣。 C ++部分看起来像这样:
using PointVec = std::vector<Point2D>;
.
.
.
JLCXX_MODULE define_julia_module(jlcxx::Module& types) {
.
.
.
types.add_type<PointVec>("PointVec")
.method("length", &PointVec::size)
.method("getindex", [](const PointVec& vec, size_t index) {
return vec.at(index);
});
.
.
.
}
这是基于我已经完成的一些搜索。我最初提到的示例只是在Julia方面创建了一个迭代器,但没有详细说明。我看到的有关创建Julia迭代器的描述非常艰巨,而且如何导入我要导入的CxxWrap类型也一点也不明显。任何提示将不胜感激。
答案 0 :(得分:0)
在Jan Disube的Julia Discourse网站的大力帮助下,我想到了一种可行的方法:
module BoostWrapper
using CxxWrap
@wrapmodule("libboost_wrap")
function __init__()
@initcxx
end
export Point2D, PointVec, getx, gety,
Polygon2D, PolygonVec, add_vertex, scale_polygon, get_vertices,
poly_intersection, intersection_point
end
using Main.BoostWrapper
import Base: getindex, length, convert, iterate, size
iterate(it::PointVec) = length(it) > 0 ? (it[1], 2) : nothing
iterate(it::PointVec, i) = i <= length(it) ? (it[i], i+1) : nothing
length(it::PointVec) = Main.BoostWrapper.size(it)
getindex(it::PointVec, i) = Main.BoostWrapper.at(it, convert(UInt64, i - 1))
eltype(::Type{PointVec}) = Point2D
p1 = Point2D(-10.0, 10.0)
p2 = Point2D(10.0, 10.0)
p3 = Point2D(10.0, -10.0)
p4 = Point2D(-10.0, -10.0)
obstacle = Polygon2D()
add_vertex(obstacle, p1)
add_vertex(obstacle, p2)
add_vertex(obstacle, p3)
add_vertex(obstacle, p4)
pts = get_vertices(obstacle)
for pt in pts
println("current pt: ", getx(pt), ", ", gety(pt))
end
我包括了很多细节,因为事实证明,名称解析等涉及到一些细微之处。