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