SWIG入門5: C/C++初級特性3

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

相關文章
相關標籤/搜索