文档章节

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

costaxu
 costaxu
发布于 2012/08/26 17:25
字数 706
阅读 636
收藏 2

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

 

 

 

© 著作权归作者所有

costaxu
粉丝 145
博文 56
码字总数 86451
作品 0
深圳
程序员
私信 提问
SWIG入门6: Python Proxy Class和Builtin Type

在前几篇文章中,从一个较高的层次上说明了SWIG的基本用法。这篇文章会深入到SWIG的一些实现的细节中。SWIG默认的封装方式,是把C/C++的struct和class封装到Python Proxy Class中。不过从SWI...

costaxu
2012/09/08
874
0
SWIG入门3: C/C++初级特性

众所周知,SWIG这个项目建立的原因,是为大家提供简洁而又自然的脚本语言接口。什么是简洁而自然呢?它的意思就是C/C++的函数就直接被封装为python的函数,class就被封装成python的class。 ...

costaxu
2012/08/11
1K
2
SWIG与JAVA 交互最全开发指南一

项目背景 最近开始研究做移动端项目,但是本人基本是做了五六年的c++的底层研发,对C++的研发可以说是驾轻就熟了,但是对于android还是属于刚入门阶段,虽然断断续续做移动端也做了一年,但是...

揽月凡尘
2018/06/16
0
0
SWIG入门4: C/C++初级特性2

1 structure 我看来,structure乃是封装之源。SWIG对于strucure的封装非常自然。自然的意思就是,C语言里怎么用PYTHON就怎么用。水里水里来,火里火里去。不过第一个问题就是,PYTHON作为面向...

costaxu
2012/08/18
1K
1
C/C++ 和 Python混合编程

链接:https://www.zhihu.com/question/23003213/answer/56121859 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 #include int main(int argc, char *...

sirius_0
2018/04/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kotlin基础语法学习

安装好安卓studio,以及插件支持Kotlin 就可以在创建项目的时候选择 Kotlin语言了。 https://www.jianshu.com/p/4ab13691d681 参考手册: https://www.runoob.com/kotlin/otlin-android-setu...

T型人才追梦者
20分钟前
4
0
java实现简单计算器

1.概述 之前作者写过一篇文章,也是关于计算器的,用的是C++与Qt,链接在这里 这次用java的swing写的(这差距好像有点大,好吧是qt太强了). 先上图: 2.UI 总体布局使用流布局. (1)文本框 文本框就...

Blueeeeeee
21分钟前
4
0
x004-python中循环结构

循环结构 Python中构造循环结构有两种做法,一种是for-in循环,一种是while循环 for in range(101)可以产生一个0到100的整数序列range(1, 100)可以产生一个1到99的整数序列range(1, 100, ...

伟大源于勇敢的开始
26分钟前
5
0
纯CSS实现DIV悬浮(固定位置)

纯CSS实现的DIV悬浮效果(固定位置),兼容常用的浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗等。效果如下: 实现代码: <!DOCTYPE html> <html> <head> <meta ...

独钓渔
今天
5
0
OSChina 周二乱弹 —— 给我来个女菩萨

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐#分享XXXTENTACION/Travis Barker的单曲《Pain = BESTFRIEND》: 《Pain = BESTFRIEND》- XXXTENTACION/...

小小编辑
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部