gpt4 book ai didi

python - Boost.Python 包装原始指针但公开方法

转载 作者:太空宇宙 更新时间:2023-11-04 13:40:40 25 4
gpt4 key购买 nike

我有一个类,其中包含我获取原始指针的方法:

struct Foo {
int getSomething() const { .. }
void setSomethingElse(int ) { .. }
// .. lots more getters, setters, and other methods ..
};

Foo* p = make_something();

我最初将其直接暴露给 python:

py::class_<Foo, Foo*, boost::noncopyable>("Foo", py::no_init)
.def("getSomething", &Foo::getSomething)
// ..
;

但是我得到的 Foo 来自一个积极重用内存的分配器,我在 python 中的使用可能会保留这些 Foo* 的时间比它们实际存在的时间长C++ 中的有效对象。所以我真的想包装它们以节省一些值(value),例如:

struct FooWrapper {
Foo* p;
int val1;

FooWrapper(Foo* p) : p(p), val1(p->getVal1()) { }

operator Foo*() const { return p; }
int getVal1() const { return val1; }
};

FooWrapper fw(make_something());

但现在为了使用Foo健康 功能,我必须将一大堆东西复制到FooWrapper 中。还是我??有没有一种方法可以编写和公开 FooWrapper 以便 getVal1() 调用 fw.getVal1() 但任何其他函数调用 fw .p->getSomethingElse() 是否可以避免复制 Foo 上的所有其他方法?毕竟这是 python,所以我猜我可以用 getattr 做些什么?

最佳答案

这比我预期的要容易:

struct FooWrapper 
{
// as before

static py::object getattr(py::object self, std::string attr)
{
FooWrapper& fw = py::extract<FooWrapper&>(self);
return py::getattr(py::object{py::ptr(fw.p)}, attr.c_str());
}
};

与:

py::class_<FooWrapper, boost::noncopyable>("Foo", py::no_init)
.def("getVal1", &FooWrapper::getVal1)
.def("getSomethingElse", &FooWrapper::getSomethingElse)
// ..
// and, finally, for everything else:
.def("__getattr__", &FooWrapper::getattr)
;

然后在 python 中:

>>> f = get_foo() # this is really a FooWrapper
>>> f.getVal1
<bound method FooWrapper.getVal1 of <Test.FooWrapper object at 0x7faacd8d48e8>>
>>> f.getVal2
<bound method Foo.getVal2 of <Test.Foo object at 0x7faacd8d6210>>
>>> f.getVal3
AttributeError: 'Foo' object has no attribute 'getV3'

关于python - Boost.Python 包装原始指针但公开方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27745127/

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