博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SWIG入门5: C/C++初级特性3
阅读量:5941 次
发布时间:2019-06-19

本文共 1840 字,大约阅读时间需要 6 分钟。

hot3.png

1 函数重载

函数重载这个特性是C++对于C的一个最重要的扩充属性了。对于C语言来说,不可能有两个SYMBOL的名字是相同的,但C++语言为了实现函数重载的这个特性,讲函数的SYMBOL名改成了 ‘函数名_参数名_参数名’ 的形式。因此,相同的函数名也就成为可能。对于函数重载,其实SWIG的支持也十分自然。比如对于这两个函数:

void foo(int);void foo(char *c);

 你在PYTHON中的调用方式几乎和C++语言中一模一样。

>>> foo(3)           # foo(int)>>> foo("Hello")     # foo(char *c)

不过有几个地方,PYTHON与C++语言特性的不同,导致有些函数的重载在PYTHON中产生了问题。比如int和short的区别:

void spam(int);void spam(short);

PYTHON中没有int short之分,假如在PYTHON中腰引用spam(short)这函数的话,就只能借助rename指令来帮忙了。

可以用

%rename (spamshort) spam(short) 对函数进行重命名来完成任务。

2 操作符重载

关于C++的操作符重载,SWIG可以让你在PYTHON中获得几乎一模一样的效果。

//file : foo.h#include 
class Foo{ public: int x; int y; Foo operator+(const Foo& f) const; Foo operator-(const Foo& f) const; friend Foo operator+(const Foo&f , int i);};

假如你拥有这样一个类, 你可以在PYTHON中一样可以用 + 和 - 这两个操作符对对象进行操作:

#!/usr/bin/python#coding: utf-8import fooif __name__=='__main__':    f=foo.Foo()    f.x=10    f.y=20    f1=foo.Foo()    f1.x=30    f1.y=30    f2=f+f1    print f2.x    print f2.y

除了一种方式之外:友元函数。C++的一个类中可以定义友元函数来实现操作符的重载。这种函数其实并非类的成员,只是定义在类内部。在这种情况下,也只能通过重命名的方式,让PYTHON来支持这种函数:

%rename (foo_add_int) operator+(const Foo&,int);

3 template模板

通过STL的案例我们知道,模板和泛型编程能提高代码的复用度。PYTHON中没有模板这种东西,那SWIG如何支持到C++的模板呢?为了解决这个问题,SWIG定义了一个template指令解决难题。

%template(pairii) pair
;

通过template关键字,可以把模板实例化。

比如你有这样的模板类:

//file: foo.htemplate
class Queue{ public: Type& Remove() { printf("Get a Type\n"); Type a; return a; } void Add(const Type&) { printf("Add a type\n"); }};

你可以通过%template指令,实例化一个Queuei类。

 %template (Queuei) Queue<int>;

在使用的时候就可以直接用这个Queuei类

#!/usr/bin/python#coding: utf-8#file: run.pyfrom foo import *if __name__=='__main__':    q=Queuei()     q.Remove()    q.Add(1)

你可以通过此链接下载本文中的例子:

 

 

 

转载于:https://my.oschina.net/costaxu/blog/74638

你可能感兴趣的文章
小tips:你不知道的 npm init
查看>>
Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决...
查看>>
Jmeter也能IP欺骗!
查看>>
Rust 阴阳谜题,及纯基于代码的分析与化简
查看>>
ASP.NET Core的身份认证框架IdentityServer4(4)- 支持的规范
查看>>
(原創) array可以使用reference方式傳進function嗎? (C/C++)
查看>>
170多个Ionic Framework学习资源(转载)
查看>>
Azure:不能把同一个certificate同时用于Azure Management和RDP
查看>>
Directx11教程(15) D3D11管线(4)
查看>>
Microsoft Excel软件打开文件出现文件的格式与文件扩展名指定格式不一致?
查看>>
ios ble 参考
查看>>
linux中注册系统服务—service命令的原理通俗
查看>>
基于托管C++的增删改查及异步回调小程序
查看>>
Oracle DBMS_STATS 包 和 Analyze 命令的区别
查看>>
linux下基本命令
查看>>
windows server 2008R2 上安装配置freesshd
查看>>
手动删除SVCH0ST.EXE的方法
查看>>
已释放的栈内存
查看>>
Android网络之数据解析----SAX方式解析XML数据
查看>>
Java递归列出所有文件和文件夹
查看>>