gpt4 book ai didi

c++ - Boost.Python : how to create & return a list of existing c++ objects, 没有复制

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

我正在使用 Boost.Python 公开另一个类中的对象数组:

class Thing {
int i; // and of course other stuff
};

class Container {
Thing *things[128];
int n_things;
}

我想为 python 提供 Things 的只读列表接口(interface)。我的 boost.python 扩展源代码中有这样的东西:

static bp::list EXTget_things(Container &c)
{
bp::list thing_list;
for (int i = 0; i < c.n_things; i++) {
thing_list.append(c.things[i]);
}
return thing_list;
}

我还有一个(不寻常的?)约束,即我无法复制 Thing 对象。他们没有一个有效的复制构造函数,我真的不能改变它。我只想返回一个包含原始对象地址的 python 列表,并相应地确保 python 在释放列表时不会释放原始对象。

我该怎么做? (或者可以完成吗?)我认识到如果 Container 超出 python 的范围可能会导致生命周期问题,但其他一些 python 代码仍然尝试使用 param_list (因为它有指向 Collection 对象的指针),但我'我愿意在这种限制下工作。

最佳答案

一种方法是公开两个类:

class_<Thing>("thing")
.def_readwrite("i", &Thing::i)
;

class_<Container>("container")
.def_readwrite("n_things", &Container::n_things)
;

然后创建一个返回对事物的引用的方法:

Thing& get_thing(Container& c, size_t index)
{
return *c.things[index];
}

最后,你应该公开这个函数:

def("get_thing", get_thing, return_value_policy<reference_existing_object>());

然后你可以遍历它:

c = mylib.container()
for i in xrange(c.n_things):
thing = get_thing(c, i)
thing.i = <INT_VALUE>

关于c++ - Boost.Python : how to create & return a list of existing c++ objects, 没有复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20478808/

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