gpt4 book ai didi

python - cppyy 与 std::function) 回调

转载 作者:行者123 更新时间:2023-12-04 10:09:50 27 4
gpt4 key购买 nike

我正在使用cppyy。我想将一个函数传递给我的 C++。 C++ 需要一个签名函数 std::function<double(std::vector<double>)> .我不知道该怎么做。这是错误的最小示例:

import cppyy

# To be passed to C
def callback(x):
return 10.

cppyy.cppdef("double callback_vector(const std::function<double(std::vector<double>)>& callback, std::vector<double> x) { return callback(x); }")
cppyy.cppdef("double callback(const std::function<double(double)>& callback, std::vector<double> x) { return callback(x[0]); }")

cppyy.gbl.callback(callback, [1]) # works
cppyy.gbl.callback_vector(callback, [1]) # fails

但我发现
Traceback (most recent call last):
File "test.py", line 11, in <module>
cppyy.gbl.callback_vector(callback, [1])
TypeError: double ::callback_vector(function<double(std::vector<double> >& callback, vector<double> x) =>
TypeError: could not convert argument 1

换句话说,用 std::function<double(std::vector<double>)>它失败了,但使用更简单的 std::function<double(double)>签名它的工作原理。

最佳答案

正如评论的那样,问题出在后端深处(一个解析错误),它破坏了 std::function命名为无法识别的东西。它这样做是为了我尝试过的一系列解决方法。

我能想出的最接近的解决方案是:

cppyy.cppdef("""
struct VecDArg : public std::vector<double> {
VecDArg(const std::vector<double>& v) : std::vector<double>(v) {}
};
double wrap_callback_vector(const std::function<double(VecDArg)>& wrap, const std::vector<double>& x) {
return callback_vector(wrap, x);
}
""")

cppyy.gbl.callback_vector = cppyy.gbl.wrap_callback_vector
cppyy.gbl.callback_vector(callback, [1])

上述工作的原因是它向后端隐藏了类型名称,从而防止了解析问题。源自 std::vector ,Python 类大多都不聪明。

编辑 : 现在在 repo 中修复。将成为 1.7.0 版的一部分。感谢举报!

关于python - cppyy 与 std::function<double(std::vector<double>) 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61386245/

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