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#includeclass 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.htemplateclass 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)
你可以通过此链接下载本文中的例子: