Boost.Python:如何创建和返回现有c ++对象的列表,无需复制
Boost.Python: how to create & return a list of existing c++ objects, no copying
我正在使用Boost.Python公开另一个类中的对象数组:
class Thing {
int i; // and of course other stuff
};
class Container {
Thing *things[128];
int n_things;
}
我想为python提供一个到Things的只读列表接口。我的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:的引用
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>
相关文章:
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 如何在不销毁对象的情况下返回对象列表
- 如何使用Q_PROPERTY公开自定义对象列表
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- c++ 循环访问对象列表并删除对象
- 循环访问对象列表 c++
- Cython正在获取C++对象列表的长度
- 如何在屏幕上显示对象列表?
- Strcmp 类行为应用于C++中的对象列表
- 如何迭代指针指向的对象列表?
- C++对象列表数组
- 使用BOOST :: PYTHON返回裸露的类对象列表,这些对象是不可复制的
- 返回对象列表
- C 链接对象列表
- 使用for_each从对象列表中调用打印功能
- 从对象列表中获取具有特定成员值的所有对象
- 按指针列出的 C++ 对象列表
- 子类对象列表重新解释为基类对象列表?(C++11).
- 在C++中的混合对象列表中使用相同的方法
- Python:我们应该如何编写一个函数来返回对象/列表和布尔标志