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

馭風萬里無垠

用Boost.Python + CMake + wxPython構建跨語言GUI程序<二>

  • Function

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

mkdir Function;
touch Function/CMakeLists.txt;
touch Function/test.cpp
對應的根目錄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})
接下來就是實際的練習代碼,添于test.cpp里。

1> 最常見的自由函數,最基本的C函數:

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

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

編譯之,只需要:

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> 接下來是函數調用里邊,參數和返回值生存期的問題,因為有可能函數返回了一個內部對象,必須要外部來釋放,或者返回對象指向參數對象的子對象,或者參數之間存在相互依賴等,這些都必須顯示指明,否則就可能被可惡的指針問題說羈絆。

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

////////////////////////////////////////////////////////////////////////////////
//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導入到Python里邊用,就必須指明其參數之間的依賴關系以及返回值應用里邊的曲曲折折,就是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>
>>> 
這里使用了類成員變量的導出來構造其他的輔助參數對象,例子也很直觀。后邊在Class的例子里邊還有更詳盡的闡釋。
3> 函數重載
重載是個很好的工具,可以用同樣的名字來描述不同的實現,下邊的是一個成員函數重載的例子(其實和Free funciton的唯一差別就是聲明導出的時候,
要在class_<T>對象的那個.后邊加def,而一般函數只要直接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)
        ;

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

Python里邊調用的例子:

>>> 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給出的提示已經包含了幾個重載的參數,其中第一個參數就是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

上邊是兩種不同的參數調用X的重載成員函數版本。

4> 函數參數的默認值

這個是c++允許函數重載的另一種方式,簡單的方法是用一個簡單的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);}

導出的方式和上邊類似:

    //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());
上邊的宏第一個參數指定了重載函數的名字,第二個是原來的函數名,最后兩個參數這表示最少和最多能夠接受多少個可變參數。

調用示例:

>>> 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> 類的成員函數參數的默認值

有些時候我們需要和類的成員函數打交道,所以對應的也有一個宏來完成那些繁雜的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);

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

這里邊有一個構造函數默認值的問題,參考下邊的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 閱讀(643) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

導航

統計

常用鏈接

留言簿(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>
            欧美三级日本三级少妇99| 国外成人在线视频| 亚洲免费影院| 一区二区三区欧美在线观看| 亚洲人成绝费网站色www| 久久久亚洲人| 久久视频在线视频| 美女视频网站黄色亚洲| 免费在线播放第一区高清av| 欧美激情亚洲国产| 日韩亚洲不卡在线| 欧美一级二区| 另类av导航| 欧美片在线观看| 国产精品久久久久久av下载红粉 | 亚洲国产你懂的| 在线免费观看日本欧美| 亚洲另类一区二区| 一区二区三区不卡视频在线观看 | 亚洲永久在线观看| 久久久久久久97| 欧美激情综合五月色丁香小说| 欧美日韩国产片| 国产亚洲欧美在线| 日韩一区二区高清| 久久久久一区| 亚洲靠逼com| 久久精品免费| 国产精品美女视频网站| 亚洲激情六月丁香| 久久国产88| 亚洲精品在线三区| 久久久精品性| 国产精品久久久久影院色老大| 亚洲风情亚aⅴ在线发布| 午夜精品视频网站| 最近中文字幕mv在线一区二区三区四区 | 亚洲国产一区二区a毛片| 亚洲综合视频一区| 欧美精品xxxxbbbb| 亚洲二区免费| 久久人人97超碰精品888| 99这里有精品| 欧美国产第二页| 精品成人一区二区三区| 欧美在线视频在线播放完整版免费观看 | 亚洲女女做受ⅹxx高潮| 亚洲福利视频在线| 欧美专区日韩视频| 国产日韩欧美高清免费| 亚洲欧美激情在线视频| 日韩写真视频在线观看| 欧美国产专区| 亚洲精品欧美| 欧美国产在线电影| 免费成年人欧美视频| 伊人成人在线| 久久久国产一区二区| 欧美一级成年大片在线观看| 国产欧美在线| 欧美在线视频二区| 欧美亚洲在线| 黄色欧美日韩| 欧美福利小视频| 欧美大片在线看免费观看| 91久久精品国产91久久| 亚洲二区免费| 欧美日韩综合视频网址| 亚洲专区免费| 午夜影院日韩| 激情久久影院| 欧美激情视频一区二区三区不卡| 开心色5月久久精品| 91久久精品国产91久久| 亚洲另类在线一区| 国产精品日韩精品欧美在线| 欧美一区二区视频在线观看2020| 亚洲一区二区三区免费观看| 国产日韩欧美一区二区| 蜜臀av在线播放一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 99精品视频免费观看| 在线视频你懂得一区| 国产一区二区日韩| 欧美激情片在线观看| 欧美日韩精品免费观看视频| 亚洲综合精品自拍| 久久国产精品免费一区| 亚洲人线精品午夜| 亚洲一区二区久久| 在线观看不卡| 一本久久a久久精品亚洲| 国产亚洲欧美一区在线观看| 亚洲国产精品一区制服丝袜| 国产精品久久久久久久久久妞妞| 久久久国产午夜精品| 欧美精品在线观看| 久久国产欧美精品| 欧美激情视频一区二区三区免费| 亚洲欧美日韩久久精品| 裸体素人女欧美日韩| 亚洲综合色自拍一区| 另类av一区二区| 欧美在线免费看| 欧美日本不卡| 欧美.日韩.国产.一区.二区| 欧美性视频网站| 欧美国产日韩a欧美在线观看| 国产精品久久久久免费a∨大胸| 欧美a级在线| 国产欧美在线观看一区| 日韩一本二本av| 亚洲欧洲偷拍精品| 久久久久久久波多野高潮日日| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久久天天操| 久久精品一区四区| 国产精品天美传媒入口| 亚洲乱码国产乱码精品精| 亚洲国产成人av在线| 欧美一区二区在线看| 亚洲欧美日韩精品在线| 欧美日韩午夜剧场| 亚洲国产日韩欧美在线99| 精品成人一区| 久久久久久久网站| 久久精品亚洲精品| 国产麻豆一精品一av一免费| 日韩亚洲精品电影| 一区二区三区产品免费精品久久75| 免费不卡亚洲欧美| 欧美aⅴ一区二区三区视频| 国产一区二区三区久久| 亚洲一区二区三区高清| 亚洲无毛电影| 欧美色图麻豆| 日韩五码在线| 亚洲午夜视频在线观看| 欧美日韩精品一区二区| 一本大道久久a久久精二百| 一区二区欧美日韩视频| 欧美日本亚洲视频| 一区二区三区四区在线| 欧美亚洲一区二区在线| 国产精品呻吟| 欧美在线综合| 女生裸体视频一区二区三区| 亚洲国产天堂网精品网站| 蜜桃久久av一区| 99国产精品| 久久成人免费视频| 影院欧美亚洲| 欧美另类极品videosbest最新版本| 亚洲三级国产| 亚洲欧美99| 狠狠色综合网站久久久久久久| 久久久水蜜桃av免费网站| 亚洲电影天堂av| 亚洲一区二区在线免费观看| 国产欧美午夜| 老司机成人网| 99精品热视频| 久久久久久亚洲精品不卡4k岛国| 影视先锋久久| 欧美日韩视频在线一区二区| 午夜精品久久久久久久99热浪潮 | 一区电影在线观看| 国产精品视频久久| 久久久人成影片一区二区三区观看| 亚洲欧洲日产国码二区| 亚洲在线成人精品| 一区二区自拍| 欧美午夜无遮挡| 久久成人免费视频| 亚洲精品视频在线看| 久久福利电影| 日韩午夜免费视频| 激情欧美一区| 国产精品你懂得| 欧美好骚综合网| 性做久久久久久久久| 亚洲国产日韩精品| 久久乐国产精品| 亚洲亚洲精品三区日韩精品在线视频| 国产欧美日韩精品在线| 欧美成人国产| 欧美一区二区三区在| 亚洲免费福利视频| 欧美国产精品劲爆| 久久精品99国产精品酒店日本| 日韩视频不卡| 精东粉嫩av免费一区二区三区| 欧美三级特黄| 欧美区国产区| 欧美激情国产日韩精品一区18| 久久精品系列| 欧美一区二区三区四区夜夜大片 | 欧美成人网在线| 久久久www成人免费毛片麻豆| 亚洲在线免费|