gpt4 book ai didi

python - 将 Python 函数传递给 Boost C++

转载 作者:行者123 更新时间:2023-11-28 02:58:30 25 4
gpt4 key购买 nike

我正在尝试了解 Boost 函数。我想将 Python 函数传递给使用 Boost Python 包装的 C++ 模块。我按照给出的例子 here并将其修改为接受接受输入参数并返回一些输出的函数。这是我的代码:

typedef double (op_t)(double);
boost::function<op_t> op;

double defaultOperator(double t) {
return t;
}

void setOperator(boost::python::object obj) {
op = obj;
}

double callOperator(double t) {
return op(t);
}

BOOST_PYTHON_MODULE(op1) {
op = &defaultOperator;

def("setOperator", &setOperator);
def("callOperator", &callOperator);
}

当我尝试编译它时,我的 setOperator 函数出现错误,提示 cannot convert 'boost::python::api::object' to 'double' in return 。如果我将 typedef 行替换为 typedef void (op_t)(double); 并将 callOperator 更改为返回 void,则代码有效。这允许我传递可以对参数进行操作但不返回任何内容的 Python 函数。

我的代码有什么问题?我应该如何更正它以传递返回值的 Python 函数?

最佳答案

经过大量搜索和反复试验后,我设法修改了我的代码,使其能够正常工作。我必须为 Boost Python 对象创建一个包装器结构,其中包含一个 operator() 方法,这样包装的对象就可以在分配给 op 之前转换为一个 Boost 函数 变量。这是修改后的代码:

struct op_wrapper_t {

op_wrapper_t( object callable ) : _callable( callable ) {}

double operator()(double t) {
return extract<double>(_callable(t));
}

object _callable;
};

void setOperator(object obj) {
op = boost::function<double (double)>( op_wrapper_t(obj) );
}

我遵循了与 this post 中类似的程序.但是,我仍然不明白为什么返回 void 的函数不需要这样的包装器/转换。

关于python - 将 Python 函数传递给 Boost C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21451863/

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