[英]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
因此,此代码编译没有错误。 但是,请注意用ONE
, TWO
和THREE
标记的四行代码,因为它们会引起错误。 在我在行解释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.