传递Python函数以增强C
Passing Python function to Boost C++
我正在尝试了解增强功能。我想将Python函数传递到使用Boost Python包装的C 模块。我遵循此处给出的示例,然后对其进行了修改,以接受采用输入参数并返回一些输出的函数。这是我的代码:
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 void (op_t)(double);
替换Typedef行并将callOperator
更换以返回void,则代码有效。这使我能够传递可以在参数上运行但不会返回任何内容的Python函数。
我的代码中有什么问题?我应该如何纠正它传递返回值的Python函数?
经过大量搜索和一些试用&amp;错误,我设法修改了我的代码以使其有效。我必须为Boost Python对象创建一个包装结构,其中包括operator()
方法,以便可以在分配给op
变量之前将包装对象作为Boost函数施放为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) );
}
我遵循与本文中的类似程序。但是,我仍然不明白为什么返回无效的功能不需要这样的包装/铸造。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- Python ctypes,回调函数增强类型是C++参考
- 连接来自未知类的成员函数以增强信号
- 崩溃:分段故障:增强序列化加载 - 用null调用构造函数
- 传递Python函数以增强C
- 增强 C++ 函数以除了 std::string 之外还采用 stringstream
- 为每个函数和自由函数增强mpl
- 增强type_erasure any与const成员函数
- 在另一个函数中增强读/写锁