gpt4 book ai didi

python - Boost.Python 返回引用现有 c++ 对象的 python 对象

转载 作者:太空狗 更新时间:2023-10-29 20:31:03 26 4
gpt4 key购买 nike

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

两者都是 GetGlobalObjectAGetGlobalObjectB返回对原始 c++ 对象的引用而不创建新拷贝;

但是如何制作GetGlobalObjectByID返回对现有 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>());}

最佳答案

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

template <typename T>inline object MagicMethod(T* ptr){    typename reference_existing_object::apply::type converter;    handle handle(converter(ptr));    return object(handle);}

这是修改后的版本。

boost::python::object GetGlobalObjectByID(int id){    if (id == 1)        return MagicMethod(&globalA);    else if (id == 2)        return MagicMethod(&globalB);    else        return boost:python::object();}

关于python - Boost.Python 返回引用现有 c++ 对象的 python 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49692157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com