C++ boost.python返回\内部\参考策略
对于以下两类:C++ boost.python返回\内部\参考策略,c++,boost-python,C++,Boost Python,对于以下两类: class A { }; class B { public: B() : a_(std::make_shared<A>()) {} std::shared_ptr<A> a_; }; 在Python中,有简单的成员检索: import ext b = ext.B() a1 = b.get_a() a2 = b.get_a() 我所期望的是 id(a1) == id(a2) 这不适用于上述情况,这意味着创建了两个
class A {
};
class B {
public:
B()
: a_(std::make_shared<A>())
{}
std::shared_ptr<A> a_;
};
在Python中,有简单的成员检索:
import ext
b = ext.B()
a1 = b.get_a()
a2 = b.get_a()
我所期望的是
id(a1) == id(a2)
这不适用于上述情况,这意味着创建了两个不同的PyObject
asA
wrapper。
为什么?return\u internal\u reference
策略是否阻止创建多个临时对象
如果我返回std::shared\u ptr。然而,在后一种情况下,有一些临时对象可能无法跟踪。另一方面,在这里,成员变量的包装器存储在python变量中。该策略允许在没有Boost的情况下返回指向内部保存对象的指针或引用。python复制引用对象。这并不意味着后续调用将返回相同的Python对象
这里是一个例子,当使用<代码> ReTrutInAualLoad引用< /C>时,C++对象不被复制,并且多个离散Python对象可以嵌入对同一C++对象的引用:
#包括
#包括//std::uintptr\t
结构化垃圾邮件
{
uintpttr_t id(){return reinterpret_cast(this);}
};
结构蛋{};
垃圾邮件和获取垃圾邮件(const egg&)
{
静态垃圾邮件实例;
返回实例;
}
BOOST_PYTHON_模块(示例)
{
名称空间python=boost::python;
python::class_(“垃圾邮件”)
.def(“id”和垃圾邮件::id)
;
python::类_u2;(“Egg”)
.def(“get_spam”,get_spam,python::return_internal_reference())
;
}
互动使用:
导入示例
egg=example.egg()
spam1=egg.get_spam()
spam2=egg.get_spam()
AsScript(SPAM1.I.())= SPAM2.ID())引用相同的C++对象
断言(id(spam1)!=id(spam2))#不相同的Python对象
谢谢。我知道C++对象没有被复制,但是对策略有错误的理解。
id(a1) == id(a2)