我正在使用boost :: python来包装C ++函数,该函数返回指向也被bp包装的现有C ++对象的指针。从Python调用该函数时,即使它们都引用相同的C ++实例,它每次也会返回一个新的Python对象。
是否有某种方法可以检查两个boost.python实例是否保持在同一个C ++对象上?
对于特定的C ++类C
,可以通过对两个python对象使用extract<C*>(pyobj)
来比较它们的C ++指针来完成。但是,这仅适用于C
类型,并且需要为每个受支持的C ++类分别定义。
boost.python类似乎都继承自Boost.Python.instance
。最好有一个is_identical
函数,可以检查任何一对Boost.Python
对象的身份。
这是最小的boost :: python代码,它定义一个geta()
函数,该函数始终返回相同的C ++实例。
// cppidentity.cpp
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/class.hpp>
#include <boost/python/reference_existing_object.hpp>
using namespace boost::python;
struct A { int a; };
A a_instance;
A* geta() { return &a_instance; }
BOOST_PYTHON_MODULE(cppidentity)
{
class_<A>("A")
.def_readwrite("a", &A::a);
def("geta", &geta,
return_value_policy<reference_existing_object>());
}
然后geta()
的结果包含相同的C ++对象,但在Python中看起来却不同:
from cppidentity import geta
a0 = geta()
a1 = geta()
print(f"(a0.a, a1.a) = {(a0.a, a1.a)}")
print("setting a0.a = 13 ..."); a0.a = 13
print(f"(a0.a, a1.a) = {(a0.a, a1.a)}")
print(f"(a0 is a1) = {a0 is a1} (a0 == a1) = {a0 == a1}")
输出
(a0.a, a1.a) = (0, 0)
setting a0.a = 13 ...
(a0.a, a1.a) = (13, 13)
(a0 is a1) = False (a0 == a1) = False