Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost.python返回\内部\参考策略_C++_Boost Python - Fatal编程技术网

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
as
A
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)