1 函數重載python
函數重載這個特性是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的區別:spa
void spam(int); void spam(short);
PYTHON中沒有int short之分,假如在PYTHON中腰引用spam(short)這函數的話,就只能藉助rename指令來幫忙了。code
能夠用對象
%rename (spamshort) spam(short) 對函數進行重命名來完成任務。utf-8
2 操做符重載get
關於C++的操做符重載,SWIG可讓你在PYTHON中得到幾乎如出一轍的效果。io
//file : foo.h #include <stdio.h> 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-8 import foo if __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<int,int>;
經過template關鍵字,能夠把模板實例化。
好比你有這樣的模板類:
//file: foo.h template<class Type> 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.py from foo import * if __name__=='__main__': q=Queuei() q.Remove() q.Add(1)
你能夠經過此連接下載本文中的例子:https://dl.dropbox.com/u/35106490/swig5.tgz