【问题标题】:Using SWIG to wrap C++ class with virtual methods and overriding them in python使用 SWIG 用虚拟方法包装 C++ 类并在 python 中覆盖它们
【发布时间】:2011-10-04 18:48:18
【问题描述】:

我在调用 python 回调时尝试“pythonize”方法参数:

%module (directors="1") py_test %feature("导演") 经理; 结构 hdr_val { 常量字符 *hdr; 常量字符 *val; }; 结构 hdr_list { 整数计数; 结构 hdr_val *elems; }; 结构我的信息 { 诠释新奇; 诠释 oldcid; 常量字符 *uri; 结构 hdr_list hlist; }; %{ PyObject* make_hdrlist(const struct hdr_list *hl) { PyObject* 结果; 结果 = PyList_New(hl->count); for(int i = 0; 我数; i++) PyList_SetItem(result, i, Py_BuildValue("(ss)", hl->elems[i].hdr, hl->elems[i].val)); 返回结果; } %} 班主任{ 民众: 经理(){} 虚拟 void doit(); virtual void done(const struct myinfo* i) // 将在 python 中重新定义 { } }; %typemap(out) struct myinfo* i { $result = Py_BuildValue("(iiso)", $1->newcid, $1->oldcid, $1->uri, make_hdrlist(&$1->hlist)); }

这样我就可以在 python 中执行以下操作:

导入 py_test 类pymgr(py_test.mgr): 定义完成(自我,信息): oldcid,newcid,uri,hlist = 信息

例如,我希望 python 中的 info 参数是 tuple("iiso") 而不是 Swig 包装器对象。

不幸的是,SWIG 出于某种原因忽略了我的typemap(out)。 有什么想法吗?

【问题讨论】:

    标签: c++ python callback swig


    【解决方案1】:

    好的,我找到了答案 typemap 应该放在 class mgr 之前

    %typemap(directorin) myinfo const * {
        $input = Py_BuildValue("(iiso)", $1_name->newcid, $1_name->oldcid, 
                               $1_name->uri, make_hdrlist(&$1_name->hlist));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2011-05-21
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多