c++ - 使用引用参数 boost python 方法调用

标签 c++ python boost boost-python

当尝试通过引用从 python 对 C++ 类方法进行简单调用时:

class Foo {
  protected:
    int _internalVal;
  public:
    Foo() : _internalVal(5){}
    void getVal(int& val_io) {val_io = _internalVal;}
    void getValDoesNothing(int val_io) {val_io = _internalVal;}
}

可以编译 boost wrapper 代码:

BOOST_PYTHON_MODULE(libBar) {
  boost::python::class_<Foo>("Foo")
    .def("getVal", &Foo::getVal)
    .def("getValDoesNothing", &Foo::getValDoesNothing);
}

但是在 python 中执行功能时会发生错误:

In [1]: import libBar

In [2]: f = libBar.Foo()

In [3]: f
Out[3]: <libBar.Foo at 0x2b483c0>

In [4]: val = int()

In [5]: #next command is just to check function signature type

In [6]: f.getValDoesNothing(val)

In [7]: f.getVal(val)
---------------------------------------------------------------------------
ArgumentError                             Traceback (most recent call last)
<ipython-input-5-531e4cea97c2> in <module>()
----> 1 f.getVal(val)

ArgumentError: Python argument types in
    Foo.getVal(Foo, int)
did not match C++ signature:
    getVal(Foo {lvalue}, int {lvalue})

我正在使用我无法控制的 C++ 库,因此更改 getVal 以返回值不是一个选项。

有什么方法可以使最后一个 Python 命令起作用吗?

我什至会采用不更改 Python 变量但仍允许函数调用的修复方法。

最佳答案

您试图实现的目标在 Python 中无效。整数是不可变的,因此您不能简单地调用一个函数并希望它会更改其内容。

由于您正在使用您无法控制的库,并且更改 getVal 以返回值不是一个选项,因此您可以创建这样的包装器:

int getVal(Foo &foo) {
    int val_io;
    foo.getVal(val_io);
    return val_io;
};

BOOST_PYTHON_MODULE(libBar) {
    boost::python::def("getVal", getVal);
    ...
}

然后这样使用:

In [1]: import libBar

In [2]: f = libBar.Foo()

In [3]: f
Out[3]: <libBar.Foo at 0x2b483c0

In [3]: libBar.getVal(f)
Out[3]: 5

关于c++ - 使用引用参数 boost python 方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13728412/

相关文章:

python - 将文件夹永久添加到 Python 的路径

python - Matplotlib Stackplot 图例错误

linux - 在 Fedora 17 上安装 Boost.Log

c++ - 将自定义类添加到 Qt 项目

c++ - OpenGL 投影/矩阵混淆

python - 如何在pygame中从面向光标方向的角色发射子弹?

c++ - 当 KEY 为 boost::optional 参数时用于 boost 多索引的迭代器

c++ - Boost 线程 : in IOS, thread_info 对象正在线程完成执行之前被破坏

c++ - 非 unicode 程序和注册表设置的语言

c++ - 可以直接从 C++ 调用 JNI C++ 方法吗?