使用::boost::python将Python函数作为参数传递给C++暴露的类

3 投票
1 回答
1514 浏览
提问于 2025-04-17 06:41

我已经在使用Python和C++一段时间了,但从来没有尝试过实现以下内容:

我希望Python用户能够写出类似这样的代码:

def foo(a,b):
    return a+b

myclass.myfunc(foo)

这里的myclass是一个通过Boost.Python暴露给Python的C++类,它有一个方法(myfunc),这个方法需要一个特定格式的函数:

int func(int,int)

这个格式就是函数的签名,仅此而已。

这样做可能吗?

我在考虑声明:

myclass::myfunc(boost::python::object)

然后提取这个类型定义的函数签名,但我只是猜测……

也许还有更好的方法来实现这个,可能可以用某种“函数”对象?

1 个回答

3

你基本上猜对了。Python 的函数其实就是 boost::python::object 的实例。你可以创建一个 boost::function<int (int, int)>,然后把这个 Python 对象放进去。

我刚安装了操作系统,还没有安装 Boost,所以我不能测试,但我觉得如果你这样做(不使用任何包装函数),应该是可以的:

void function(boost::function<int (int, int)> func) {
    // ...
}

// And then you expose the function as you normally would

我预计上面的代码会有效;如果不行,那这个肯定可以:

void function_wrap(boost::python::object func)
{
    auto lambda = [func](int a, int b) -> int {
        return boost::python::extract<int>(func(a, b));
    };
    function(boost::function<int (int, int)>(lambda));
}

// And then you expose the wrapper, not the original function

撰写回答