青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

馭風萬里無垠

用Boost.Python + CMake + wxPython構(gòu)建跨語言GUI程序<二>

  • Function

接下來是函數(shù)部分,在根目錄下邊新添加一個子項目,連同其子目錄,并且在根目錄的CMakeLists.txt里邊加入對應(yīng)聲明:

mkdir Function;
touch Function/CMakeLists.txt;
touch Function/test.cpp
對應(yīng)的根目錄CMakeLists.txt后邊加入:
add_subdirectory(Function)

編輯Function的CMakeLists.txt:

project(Function)
set(lib_target function)

include_directories(${Boost_INCLUDE_DIRS})
add_library(${lib_target} SHARED test.cpp)
set_target_properties(${lib_target} PROPERTIES PREFIX "")
target_link_libraries(${lib_target} ${Boost_LIBRARIES})
接下來就是實際的練習(xí)代碼,添于test.cpp里。

1> 最常見的自由函數(shù),最基本的C函數(shù):

//dummy function
void dummyFunc()
{
    cout << "Dummy function called!" << endl;
}
對應(yīng)的Wrapper為:
BOOST_PYTHON_MODULE(function)
{
def(fun, dummyFunc)
..................
..................
}

這里需要留意的是,對應(yīng)的MODULE里邊的那個名字必須和CMakeLists.txt里邊制定的庫名字完全一樣,否則python導(dǎo)入對應(yīng)的模塊時候會報錯誤。

編譯之,只需要:

cd ../Build;
make
ls lib/function.so
cd lib
在Python里邊測試,可以用了:
$python
Python 2.6.2 (r262:71600, Aug  8 2009, 19:23:16) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import function
>>> function.dummyFunc()
Dummy function called!
>>> 

2> 接下來是函數(shù)調(diào)用里邊,參數(shù)和返回值生存期的問題,因為有可能函數(shù)返回了一個內(nèi)部對象,必須要外部來釋放,或者返回對象指向參數(shù)對象的子對象,或者參數(shù)之間存在相互依賴等,這些都必須顯示指明,否則就可能被可惡的指針問題說羈絆。

下邊是一個很極端的例子:

////////////////////////////////////////////////////////////////////////////////
//calling policy
struct InnerType
{
    int i;
    int j;
};

struct RefType
{
    float i;
    double j;
};

struct ComposedType
{
    InnerType contained;
    RefType*  ref;
};

//really bad ?
InnerType& Func(ComposedType& x, RefType* z)
{
    x.ref = z;
    return x.contained;
} 

想正確的把最后這個Func導(dǎo)入到Python里邊用,就必須指明其參數(shù)之間的依賴關(guān)系以及返回值應(yīng)用里邊的曲曲折折,就是z指向的對象必須又x來管理,而返回值則是x的一個子對象,這里用Policy來指定:

class_<ComposedType>("ComposedType")
        .def_readwrite("contained", &ComposedType::contained)
        .def_readonly("ref", &ComposedType::ref);
    class_<RefType>("RefType")
        .def_readwrite("i", &RefType::i)
        .def_readwrite("j", &RefType::j);
    class_<InnerType>("InnerType")
        .def_readwrite("i", &InnerType::i)
        .def_readwrite("j", &InnerType::j);
def("Func", Func,
        return_internal_reference<1,
        with_custodian_and_ward<1, 2> >()     
    );
這種繁瑣的情況,還是盡量少用來做公有接口的好吧。
一個測試的例子:
Python 2.6.2 (r262:71600, Aug  8 2009, 19:23:16) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import function
>>> x=function.ComposedType()
>>> x.contained.i=1
>>> x.contained.j=2
>>> z=function.RefType()
>>> z.i=1
>>> z.j=3
>>> y=function.Func(x,z)
>>> y.i
1
>>> y.j
2
>>> y
<function.InnerType object at 0x7fead87ff910>
>>> 
這里使用了類成員變量的導(dǎo)出來構(gòu)造其他的輔助參數(shù)對象,例子也很直觀。后邊在Class的例子里邊還有更詳盡的闡釋。
3> 函數(shù)重載
重載是個很好的工具,可以用同樣的名字來描述不同的實現(xiàn),下邊的是一個成員函數(shù)重載的例子(其實和Free funciton的唯一差別就是聲明導(dǎo)出的時候,
要在class_<T>對象的那個.后邊加def,而一般函數(shù)只要直接Def即可):
////////////////////////////////////////////////////////////////////////////////
//Overloadding
struct X
{ 

    bool f(int a)
    {
        return true;
    } 

    bool f(int a, double b)
    {
        return true;
    } 

    bool f(int a, double b, char c)
    {
        return true;
    } 

    int f(int a, int b, int c)
    {
        return a + b + c;
    };
};

 

聲明的時候,則要費時一點:

 //helpers
    bool    (X::*fx1)(int)              = &X::f;
    bool    (X::*fx2)(int, double)      = &X::f;
    bool    (X::*fx3)(int, double, char)= &X::f;
    int     (X::*fx4)(int, int, int)    = &X::f;
    class_<X>("X")
        .def("f", fx1)
        .def("f", fx2)
        .def("f", fx3)
        .def("f", fx4)
        ;

上邊用了幾個輔助函數(shù)來指向同一個函數(shù),然后將他們都導(dǎo)出到同一個python對象的同一個成員函數(shù)下邊即可。

Python里邊調(diào)用的例子:

>>> import function
>>> obj=function.X()
>>> help(obj.f)
Help on method f:

f(...) method of function.X instance
    f( (X)arg1, (int)arg2) -> bool :
    
        C++ signature :
            bool f(X {lvalue},int)
    
    f( (X)arg1, (int)arg2, (float)arg3) -> bool :
    
        C++ signature :
            bool f(X {lvalue},int,double)
    
    f( (X)arg1, (int)arg2, (float)arg3, (str)arg4) -> bool :
    
        C++ signature :
            bool f(X {lvalue},int,double,char)
    
    f( (X)arg1, (int)arg2, (int)arg3, (int)arg4) -> int :
    
        C++ signature :
            int f(X {lvalue},int,int,int)

這里help給出的提示已經(jīng)包含了幾個重載的參數(shù),其中第一個參數(shù)就是C++的this指針或者python的self。

>>> obj.f(1,1.1)
True
>>> obj.f(1,1, 3)
5
>>> function.X.f(obj, 1, 1.2, "msg")
True

上邊是兩種不同的參數(shù)調(diào)用X的重載成員函數(shù)版本。

4> 函數(shù)參數(shù)的默認值

這個是c++允許函數(shù)重載的另一種方式,簡單的方法是用一個簡單的wrapper來寫一些helper,如下:

////////////////////////////////////////////////////////////////////////////////
//Default args
int fn(int, double = 3.14, char const* = "hello")
{
    return 1;
}

//wrapper
int fn1(int x) {return fn(x);}
int fn2(int x, double y) { return fn(x,y);}

導(dǎo)出的方式和上邊類似:

    //default args
    def("f", fn);
    def("f", fn1);
    def("f", fn2);

當然boost.python提供了一個宏來完成上邊的封裝,因此用下邊的方式則更簡單:

BOOST_PYTHON_FUNCTION_OVERLOADS(fn_overloads, fn, 1, 3);

    def("fn", fn, fn_overloads());
上邊的宏第一個參數(shù)指定了重載函數(shù)的名字,第二個是原來的函數(shù)名,最后兩個參數(shù)這表示最少和最多能夠接受多少個可變參數(shù)。

調(diào)用示例:

>>> func = function.f
>>> help(func)
Help on built-in function f:

f(...)
    f( (int)arg1, (float)arg2, (str)arg3) -> int :
    
        C++ signature :
            int f(int,double,char const*)
    
    f( (int)arg1) -> int :
    
        C++ signature :
            int f(int)
    
    f( (int)arg1, (float)arg2) -> int :
    
        C++ signature :
            int f(int,double)
>>> fn = function.fn
>>> help(fn)
Help on built-in function fn:

fn(...)
    fn( (int)arg1 [, (float)arg2 [, (str)arg3]]) -> int :
    
        C++ signature :
            int fn(int [,double [,char const*]])
>>> func(1,2.2, "str")
1
>>> fn(1)
1
>>> fn(1, 2.2)
1

5> 類的成員函數(shù)參數(shù)的默認值

有些時候我們需要和類的成員函數(shù)打交道,所以對應(yīng)的也有一個宏來完成那些繁雜的wrapper:

////////////////////////////////////////////////////////////////////////////////
//Mem_fun
struct Y
{
    Y(int i, int j, int k=0, int p=1.2){}
    void mem_fn(int i, int j = 0, double k=1.2, const std::string& str="msg"){}
}; 

BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(mem_fn_overloads, mem_fn, 1, 4);

宏的作用和上邊的那個用于普通函數(shù)的差不多。

這里邊有一個構(gòu)造函數(shù)默認值的問題,參考下邊的optional模板:

    //Mem_fn and optional init
    class_<Y>("Y", init<int, int, optional<int, double> >())
        .def("mem_fn", &Y::mem_fn, mem_fn_overloads());

posted on 2009-08-10 20:49 skyscribe 閱讀(636) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導(dǎo)航

統(tǒng)計

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩小视频在线观看专区| 久久狠狠婷婷| 午夜精品在线| 亚洲综合视频1区| 亚洲视频精品| 亚洲免费人成在线视频观看| 日韩一区二区福利| 亚洲视屏一区| 亚洲在线观看免费| 欧美中文在线观看| 久久频这里精品99香蕉| 牛牛影视久久网| 欧美日韩午夜剧场| 亚洲精品一级| 亚洲一区二区在线看| 欧美亚洲综合在线| 欧美xxx在线观看| 欧美日韩日韩| 国产在线一区二区三区四区 | 国产精品美女主播| 国产亚洲精品福利| 最新69国产成人精品视频免费| 日韩视频一区二区| 欧美一区中文字幕| 亚洲国产精品综合| 亚洲精品综合| 久久精品国产免费看久久精品| 欧美夫妇交换俱乐部在线观看| 欧美日韩一本到| 黑丝一区二区三区| 亚洲性图久久| 免播放器亚洲| 亚洲欧美综合v| 欧美日韩精品免费观看| 极品少妇一区二区| 性欧美xxxx大乳国产app| 欧美激情一区| 久久久精品国产免费观看同学| 欧美午夜精品一区| 亚洲精品视频啊美女在线直播| 欧美在线首页| 亚洲少妇中出一区| 欧美日韩理论| 日韩一级欧洲| 欧美激情按摩| 久久精品国产清自在天天线 | 久久久无码精品亚洲日韩按摩| 欧美三区不卡| 夜夜嗨av一区二区三区四区| 久久久亚洲午夜电影| 国产精品99久久99久久久二8 | 国产一区在线播放| 午夜久久久久| 亚洲一区二区不卡免费| 欧美日本视频在线| 亚洲乱码精品一二三四区日韩在线 | 国产日韩欧美91| 99视频一区| 亚洲国产成人av| 久久久久久噜噜噜久久久精品| 国产精品一区二区你懂的| 亚洲少妇在线| 夜夜爽夜夜爽精品视频| 欧美日韩国产综合久久| 99精品国产在热久久下载| 欧美激情精品久久久久久大尺度| 久久久99爱| 亚洲电影自拍| 亚洲国产专区校园欧美| 欧美乱人伦中文字幕在线| 99国产一区| 亚洲无线视频| 国产精品日日摸夜夜添夜夜av | 伊人伊人伊人久久| 蜜桃av综合| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久亚洲精品视频| 亚洲国产婷婷| 亚洲日韩欧美视频| 国产精品欧美一区二区三区奶水 | 亚洲最新在线| 国产精品影院在线观看| 久久频这里精品99香蕉| 欧美成人免费全部| 亚洲视频久久| 性欧美暴力猛交另类hd| 在线播放日韩专区| 日韩午夜av电影| 国内精品久久久久久 | 在线成人小视频| 亚洲精品国产精品国自产在线| 欧美午夜电影一区| 六月婷婷久久| 欧美深夜影院| 国产精品啊啊啊| 国产欧美日韩精品一区| 久久久久久久综合狠狠综合| 久久婷婷影院| 亚洲一区二区三区三| 久久er99精品| 亚洲无线一线二线三线区别av| 午夜免费在线观看精品视频| 亚洲国产成人午夜在线一区| 一区二区三区鲁丝不卡| 狠狠噜噜久久| 亚洲视频免费| 亚洲精品欧美日韩专区| 久久精品男女| 欧美一级欧美一级在线播放| 女女同性女同一区二区三区91| 西瓜成人精品人成网站| 欧美激情一区二区三区蜜桃视频| 久久国内精品视频| 国产精品豆花视频| 亚洲黄一区二区三区| 一区在线电影| 欧美影院成年免费版| 亚洲性线免费观看视频成熟| 欧美国产日产韩国视频| 可以免费看不卡的av网站| 国产精品网站在线| 亚洲人成网站777色婷婷| 亚洲成色999久久网站| 欧美一区二区性| 午夜久久电影网| 国产精品magnet| 99riav久久精品riav| 亚洲精品小视频在线观看| 久久久国产精品一区二区三区| 先锋影音久久久| 国产精品xvideos88| 日韩午夜在线视频| 99视频在线观看一区三区| 欧美www视频| 欧美激情亚洲另类| 亚洲激情一区二区| 老巨人导航500精品| 女人色偷偷aa久久天堂| 在线观看成人网| 蜜桃视频一区| 亚洲国产精品传媒在线观看| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产视频一区在线观看| 亚洲欧美日韩成人高清在线一区| 亚洲欧美日韩久久精品| 国产精品亚洲综合久久| 欧美一区二区三区播放老司机 | 在线亚洲精品| 欧美色图麻豆| 亚洲欧美日韩国产成人精品影院| 午夜日韩视频| 国精产品99永久一区一区| 久久精品一二三| 欧美第一黄网免费网站| 亚洲精品自在久久| 欧美揉bbbbb揉bbbbb| 午夜激情综合网| 国产精品久久久久久久久久久久久| 在线综合视频| 国产伦精品一区二区三区四区免费| 亚洲免费在线视频一区 二区| 欧美在线黄色| 1769国产精品| 欧美日韩喷水| 欧美中文字幕在线| 亚洲国产欧美一区二区三区久久 | 久久精品久久综合| 亚洲欧洲日韩在线| 欧美亚州一区二区三区| 久久精品夜色噜噜亚洲a∨ | 亚洲国产三级网| 亚洲一区在线直播| 狠狠色噜噜狠狠色综合久| 欧美精品成人91久久久久久久| 国产精品99久久久久久久女警| 欧美中文在线视频| 亚洲免费大片| 国产日韩在线视频| 欧美黄色一区| 欧美一区在线视频| 艳妇臀荡乳欲伦亚洲一区| 久久久久久久久久久久久女国产乱 | 欧美激情精品久久久久久久变态| 一区二区三区精品久久久| 久久人人看视频| 亚洲女女女同性video| 在线观看91精品国产入口| 国产精品久久久久久久电影| 久久天堂成人| 午夜精品久久久久| 亚洲精选国产| 欧美高清免费| 久久偷窥视频| 午夜精品一区二区三区在线播放 | 久久久久久尹人网香蕉| 夜夜爽99久久国产综合精品女不卡| 国产午夜亚洲精品不卡| 欧美丝袜一区二区三区| 欧美成人午夜视频| 蜜桃视频一区|