如何使用SWIG将C运算符[]包装在命名空间内的模板类中?
发布时间:2020-12-16 05:04:41 所属栏目:百科 来源:网络整理
导读:我正在使用SWIG仅使用其头文件来包装现有的C库.此库使用命名空间和模板类来创建自定义对象的数组.我在尝试包装用于访问包装数组内部元素的下标运算符(operator [])时遇到了问题. SWIG告诉我操作符[]被忽略,我应该使用%extend代替: small.i:18: Warning 389
我正在使用SWIG仅使用其头文件来包装现有的C库.此库使用命名空间和模板类来创建自定义对象的数组.我在尝试包装用于访问包装数组内部元素的下标运算符(operator [])时遇到了问题. SWIG告诉我操作符[]被忽略,我应该使用%extend代替:
small.i:18: Warning 389: operator[] ignored (consider using %extend) 所以我试图使用extend但是无论我尝试了什么语法,我都无法将插入的代码显示在_wrap.cxx文件中.这是我的SWIG输入文件: %module tltest %{ ... %} namespace nite { template <class T> class Array { public: %rename(__getitem__) operator[]; const T& operator[](int index) const {return m_data[index];} %rename(__len__) getSize; int getSize() const {return m_size;} }; class UserData : private NiteUserData { public: }; %template(userDataArray) Array<UserData>; }; %extend Array<UserData> { UserData& __getitem__(unsigned int i) { return $self[i]; } } 我知道我想为Python定义__getitem__函数以便能够索引到数组类.请注意,__len__函数确实已正确重命名,并且可以从Python界面正常工作. 但是,我添加的用于定义__getitem__调用的%扩展块似乎永远不会被注入到small_wrap.cxx包装文件中.谁能看到我做错了什么? 解决方法
啊哈!我发现您需要使用%extend块中的命名空间限定所有类型,如下所示:
%extend nite::Array<nite::UserData> { nite::UserData __getitem__(unsigned int i) { return (*($self))[i]; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |