SWIG入门5: C/C++初级特性3

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 <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

 

 

 

    原文作者:python入门
    原文地址: https://my.oschina.net/costaxu/blog/74638
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞