在自定义类型图中重用 SWIG 映射
Reusing SWIG mappings in custom typemap
我目前正在为一个C++库开发一个Python包装器,我想使用它SWIG。在我的C++库中,我有一个具有以下签名的方法:
std::vector<SomeClass> getMembers();
现在我知道SWIG有内置的std::vector支持,但我想明确地将std::vectors转换为Python列表(我只是认为它更干净(。为此,我有以下类型图:
template<typename T>
PyObject* toList(vector<T> vec){
size_t size = vec.size();
PyObject *o = PyList_New(size);
for(size_t i = 0; i < size; i++){
PyList_SetItem(o, i, toPythonInstance<T>(vec[i]));
}
return o;
}
%define OUTPUT_VEC_TO_LIST(type)
%typemap (out) std::vector<type> {
$result = toList<type>($1);
}
%enddef
现在模板方法:
template<T>
PyObject* toPythonInstance(T& val){}
可以专门用于添加对必要数据类型的支持。我现在面临的问题如下:
SomeClass由 SWIG 自动包装。所以我喜欢做的是在我的矢量类型映射中重用这个包装器,即具有以下内容:
template<>
PyObject* toPythonInstance<SomeClass>(SomeClass& val){
//call some SWIG macro to automatically wrap the given instance to
//a Python object
}
检查SWIG生成的代码,我已经找到了以下功能
SWIG_NewPointerObj(...);
SWIG_ConvertPtr(...);
这似乎负责做我想做的事。但是,我不想干扰SWIG的任何内部结构。因此,如果有人知道如何通过"公共"SWIG界面实现我想要的东西,我会非常高兴!
SWIG 实际上使一大堆运行时信息成为外部接口的一部分,有关详细信息,请参阅 http://www.swig.org/Doc3.0/Modules.html#Modules_external_run_time。这包括您可能想要的功能。
我不同意您的评估,即在 Python 中将std::vector
映射到列表更干净 - 您最终总是复制并访问该向量的每个成员来执行此操作。实际上,您创建了原始容器的副本,最终得到了两个容器,因此对 Python 列表的更改不会反映在基础C++容器上。Python提供的std::vector
包装应该实现你关心的协议,以默认启用pythonic语法,并且可以正确支持ABC。(如果他们不这样做,我愿意写补丁!
相关文章:
- 在自定义类型图中重用 SWIG 映射
- 为C++重载函数创建SWIG类型映射
- 返回各种类型的函数的SWIG类型映射
- 指向类的指针的 STL 映射的 SWIG 类型图
- SWIG 多参数类型映射适用于函数,但如果有多个构造函数,则不适用于构造函数
- Swig:如何类型映射c ++字符串常量和python字符串?
- 如何将 SWIG 用于 STL 映射
- SWIG 类型映射的 python 列表到双倍 *
- SWIG -- 在扩展中使用类型映射
- SWIG类型映射中的内存释放
- 您将如何为 std::list<std::string> 创建一个类型映射,以在<String> List in C++ 中为 Java 在 SWIG 中创建?
- SWIG-为具有四个参数的函数创建一个类型映射,该参数传递一个字节数组
- SWIG 不可变标准::映射引用
- Swig 界面中的类型映射错误
- 如何在 swig 中引用类型映射类
- swig从c++结构到PyLong的类型映射
- 使用SWIG类型映射通过字符串转换类型
- 使用SWIG对java进行类型映射异常,仍然没有被捕获
- 如何使用 swig 类型映射将 std::vector<std::p air<std::string, int> > 从 java 返回到 c++
- 如何在Python中为类类型应用SWIG OUTPUT类型映射