Python返回引用现有c++;物体 < P>假设我想得到一些全局/内部C++对象的引用,一种方法是用 Boo::Python::ReTurnValueEx PraseAudio()/代码> < /P>声明函数。 > GETGULALOBOSTECAT/和代码> GETGULALOBOSTEXB/将引用返回给原始C++对象而不创建新副本;
<>但是如何使<代码> GETGOLLASObjistBID<代码>返回一个REF到现有C++对象? struct A { uint32_t value; }; struct B { uint64_t value; }; A globalA; B globalB; boost::python::object GetGlobalObjectByID(int id) { // boost::python::object will return a new copy of C++ object, not the global one. if (id == 1) return boost::python::object(&globalA); else if (id == 2) return boost::python::object(&globalB); else return boost::python::object(nullptr); } A& GetGlobalObjectA() { return globalA; } B& GetGlobalObjectB() { return globalB; } BOOST_PYTHON_MODULE(myModule) { using namespace boost::python; class_<A>("A"); class_<B>("B"); def("GetGlobalObjectByID", GetGlobalObjectByID); def("GetGlobalObjectA", GetGlobalObjectA, return_value_policy<reference_existing_object>()); def("GetGlobalObjectB", GetGlobalObjectB, return_value_policy<reference_existing_object>()); } 结构A{uint32_t value;}; 结构B{uint64_t value;}; 球形; B全球B; boost::python::对象GetGlobalObjectByID(int-id) { //BOOT::Python::对象将返回C++对象的新副本,而不是全局对象。 如果(id==1) 返回boost::python::object(&globalA); else if(id==2) 返回boost::python::object(&globalB); 其他的 返回boost::python::object(nullptr); } A&GetGlobalObjectA(){return globalA;} B&GetGlobalObjectB(){return globalB;} BOOST_PYTHON_模块(myModule) { 使用名称空间boost::python; 类别A<A>(“A”); 类别B<B>(“B”); def(“GetGlobalObjectByID”,GetGlobalObjectByID); def(“GetGlobalObjectA”,GetGlobalObjectA,return_value_policy<reference_existing_object>()); def(“GetGlobalObjectB”,GetGlobalObjectB,返回值、策略和ltreference、现有对象和gt()); } 基于此,我发现可以使用Python返回引用现有c++;物体 < P>假设我想得到一些全局/内部C++对象的引用,一种方法是用 Boo::Python::ReTurnValueEx PraseAudio()/代码> < /P>声明函数。 > GETGULALOBOSTECAT/和代码> GETGULALOBOSTEXB/将引用返回给原始C++对象而不创建新副本;,python,c++,boost,boost-python,Python,C++,Boost,Boost Python,但是如何使 GETGOLLASObjistBID返回一个REF到现有C++对象? struct A { uint32_t value; }; struct B { uint64_t value; }; A globalA; B globalB; boost::python::object GetGlobalObjectByID(int id) { // boost::python::object will return a new copy of C++ object, not th
reference\u existing\u object::apply
作为转换器
template <typename T>
inline object MagicMethod(T* ptr)
{
typename reference_existing_object::apply::type converter;
handle handle(converter(ptr));
return object(handle);
}
模板<typename T>
内联对象MagicMethod(T*ptr)
{
typename引用\现有\对象::应用::类型转换器;
手柄(转换器(ptr));
返回对象(句柄);
}
这是修改后的版本
boost::python::object GetGlobalObjectByID(int id)
{
if (id == 1)
return MagicMethod(&globalA);
else if (id == 2)
return MagicMethod(&globalB);
else
return boost:python::object();
}
boost::python::对象GetGlobalObjectByID(int-id)
{
如果(id==1)
返回MagicMethod(&globalA);
else if(id==2)
返回MagicMethod(&globalB);
其他的
返回boost:python::object();
}