繁体   English   中英

boost:python不返回指针

[英]boost:python does not return a pointer

我有一个用C++编写的小型Python模块。 该模块编译良好,可以毫无错误地导入到Python 以下是一些代码片段:

//...multiple includes

typedef variant<sqlite3 **, ... other types> VariantData; //!ONE

class ORM{
   //... private fields
   public:
       VariantData Connect(int idx){
           if(idx == 0) {
               sqlite3 * conn;
               sqlite3_open("reestr.db", &conn); 
               return &conn; //!TWO
               // how to return a pointer to conn ???
               // am I doing it right ???
           }
       }
  //... other methods

  // Python stuff
  BOOST_PYTHON_MODULE(corm){   
      to_python_converter<VariantData, variant_to_object>(); //!THREE
      implicitly_convertible<sqlite3 **, VariantData>(); //!THREE

  //other unimportant code

因此,此代码编译没有错误。 但是,请注意用ONETWOTHREE标记的四行代码,因为它们会引起错误。 在我在行解释ONE我定义了一个变型的数据类型,可以采取不同的值与sqlite3 **当中。 THREE行,我定义了负责转换变量并将其在C++Python之间传递的Python东西。 但是,当我尝试在Python使用此模块时会遇到麻烦。 我这样做:

>>> import corm
>>> c = corm.ORM(...initialization parameters...)
>>> r = c.Connect() # !ERROR
... No to_python (by-value) converter found for C++ type: sqlite *

我真的想知道为什么Python在这里谈论sqlite *类型,而方法本身确实return &conn; 因此返回类型为sqlite3 **的变量(据我所相信)。 因此,简而言之,我的问题是如何从Connect方法返回sqlite3 **类型的指针。

这是一个解决方案。 我不确定它是否很好,但至少它能起作用:

typedef variant<void *, ... other types> VariantData;

class ORM{
//... private fields
    public:
        VariantData Connect(int idx){
           if(idx == 0) {
               sqlite3 * conn;
               sqlite3_open("reestr.db", &conn); 
               void * ref = ::operator new(sizeof(conn));
               ref = conn;
               return ref;
           }
           ...
        }
....
};

struct variant_to_object {
    static PyObject* convert(VariantData const& v){
    return boost::python::incref(
      boost::python::object(v).ptr());
    }
};

BOOST_PYTHON_MODULE(corm){   
     to_python_converter<VariantData, variant_to_object>();
     implicitly_convertible<void *, VariantData>(); 

但是,当然,当不再使用ref指针时,我应该注意并delete它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM