【问题标题】:Boost.Python return python object which references to existing c++ objectsBoost.Python 返回引用现有 c++ 对象的 python 对象
【发布时间】:2018-09-16 10:40:09
【问题描述】:

假设我想获取某个全局/内部 c++ 对象的引用,一种方法是使用boost::python::return_value_policy<reference_existing_object>() 声明函数。

GetGlobalObjectAGetGlobalObjectB 都返回对原始 c++ 对象的引用而不创建新副本;

但是如何让GetGlobalObjectByID返回一个对现有c++对象的引用呢?

结构 A { uint32_t 值; }; 结构 B { uint64_t 值; }; 一个全局A; B全球B; boost::python::object GetGlobalObjectByID(int id) { // boost::python::object 将返回 C++ 对象的新副本,而不是全局对象。 如果(id == 1) 返回 boost::python::object(&globalA); 否则如果(id == 2) 返回 boost::python::object(&globalB); 别的 返回 boost::python::object(nullptr); } A& GetGlobalObjectA() { return globalA; } B& GetGlobalObjectB() { return globalB; } BOOST_PYTHON_MODULE(我的模块) { 使用命名空间 boost::python; class_&ltA&gt("A"); class_&ltB&gt("B"); def("GetGlobalObjectByID", GetGlobalObjectByID); def("GetGlobalObjectA", GetGlobalObjectA, return_value_policy&ltreference_existing_object&gt()); def("GetGlobalObjectB", GetGlobalObjectB, return_value_policy&ltreference_existing_object&gt()); }

【问题讨论】:

    标签: python c++ boost boost-python


    【解决方案1】:

    基于这个answer,我发现可以使用reference_existing_object::apply作为转换器。

    模板&lttypename T&gt 内联对象 MagicMethod(T* ptr) { typename reference_existing_object::apply::type 转换器; 句柄句柄(转换器(ptr)); 返回对象(句柄); }

    这是修改后的版本。

    boost::python::object GetGlobalObjectByID(int id) { 如果(id == 1) 返回 MagicMethod(&globalA); 否则如果(id == 2) 返回 MagicMethod(&globalB); 别的 返回 boost:python::object(); }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多