cppyy - 如何调用接受集合的 c++ 函数?
Posted
技术标签:
【中文标题】cppyy - 如何调用接受集合的 c++ 函数?【英文标题】:cppyy - how to call a c++ function that accepts a set? 【发布时间】:2019-05-26 15:10:38 【问题描述】:假设我有以下 C++ 函数:
int summap(const map<int,int>& m)
...
我尝试使用 cppyy 从 Python 调用它,方法是发送一个 dict:
import cppyy
cppyy.include("functions.hpp")
print(cppyy.gbl.summap(55:1,66:2,77:3))
我收到一个错误:
TypeError: int ::summap(const map<int,int>& v) =>
TypeError: could not convert argument 1
如何调用这个函数?
【问题讨论】:
【参考方案1】:Python的dict和C++的std::map没有关系(两者内部结构完全不同),所以需要转换,目前cppyy中没有自动转换,可以这样操作:
cppm = cppyy.gbl.std.map[int, int]()
for key, value in 55:1,66:2,77:3.items():
cppm[key] = value
然后将 cppm 传递给 summap。
对 python 列表/元组的自动支持 -> std::vector 是可用的,但在那里,它也不比复制更聪明(同样,b/c 内部结构完全不同),所以任何自动 std::map python dict 转换在内部仍然需要像上面那样做一个副本。
【讨论】:
以上是关于cppyy - 如何调用接受集合的 c++ 函数?的主要内容,如果未能解决你的问题,请参考以下文章
从 c++ 中用 cppyy 读取 char16_t* 字符串
使用 c++ 中的 cppyy 在用户定义的结构中读取 char16_t* 字符串
带有 std::function<double(std::vector<double>) 回调的 cppyy
通过 C++ pythonization 回调将 operator() 的 cppyy 自动映射恢复到 __getitem__