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

馭風萬里無垠

用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 閱讀(636) 評論(0)  編輯 收藏 引用

<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>
            国产日本亚洲高清| **性色生活片久久毛片| 日韩一区二区免费高清| 美女黄网久久| 久久成人久久爱| 亚洲视频第一页| 亚洲尤物精选| 一区二区三区视频在线看| 亚洲精品久久久久| 亚洲国产欧美日韩精品| 亚洲国产视频一区二区| 亚洲国产精品www| 亚洲成色精品| 亚洲国产精品久久精品怡红院| 在线日韩欧美视频| 在线观看欧美精品| 黄色成人av| 亚洲国产一区二区视频| 亚洲人成亚洲人成在线观看图片 | 国产精品区一区| 国产精品久久久久久亚洲调教| 国产精品自在线| 国产视频欧美| 在线免费不卡视频| 99精品视频免费观看| 亚洲欧美日韩在线观看a三区| 久久免费99精品久久久久久| 欧美激情第五页| 亚洲视频狠狠| 老司机午夜精品视频在线观看| 欧美日本亚洲| 一区二区三区中文在线观看| 亚洲美女性视频| 久久亚洲一区二区| 在线亚洲伦理| 蜜臀av国产精品久久久久| 国产精品海角社区在线观看| 激情综合在线| 在线综合视频| 久久综合给合| 亚洲一区二区三区精品在线| 久久视频在线看| 99精品免费| 亚洲综合色激情五月| 久久精品国产久精国产爱| 久久人人97超碰精品888| 欧美激情一区二区三区四区 | 99成人免费视频| 亚洲免费视频观看| 免费成人黄色| 欧美在线视频一区| 国产精品女主播| 亚洲一区二区在线视频| 亚洲电影在线播放| 性久久久久久| 欧美日韩精品在线视频| 最新日韩精品| 欧美黄色aa电影| 久久精品中文字幕一区二区三区| 欧美日韩国语| 日韩系列在线| 亚洲国产欧美不卡在线观看| 久久夜色精品国产欧美乱极品| 国产亚洲综合精品| 亚洲天堂久久| 亚洲婷婷国产精品电影人久久| 欧美精品在线一区二区| 亚洲国产精品成人综合色在线婷婷| 久久不见久久见免费视频1| 亚洲精品在线看| 欧美日韩一区精品| 夜夜夜久久久| 一区二区三区|亚洲午夜| 欧美视频国产精品| 亚洲欧美韩国| 欧美在线观看视频一区二区| 黄网站免费久久| 欧美激情1区2区| 欧美日本三级| 久久精品国产清高在天天线| 久久精品人人做人人综合| 在线日韩成人| 99re热这里只有精品免费视频| 欧美午夜不卡在线观看免费 | 久久久久99| 亚洲欧洲精品成人久久奇米网| 亚洲娇小video精品| 欧美理论在线播放| 羞羞答答国产精品www一本 | 亚洲人成啪啪网站| 国产精品国产三级国产aⅴ浪潮| 欧美一区二粉嫩精品国产一线天| 欧美亚洲在线| 亚洲精品乱码久久久久久| 99热在线精品观看| 模特精品裸拍一区| 一级成人国产| 国产欧美亚洲日本| 欧美激情第六页| 国产精品一香蕉国产线看观看| 久久久99爱| 欧美日本韩国一区| 美国成人直播| 国产精品国产三级国产| 免费在线成人av| 国产精品久久久久aaaa九色| 久久综合久久久| 国产精品免费看久久久香蕉| 欧美88av| 国产欧美在线观看| 亚洲美女色禁图| 在线观看欧美成人| 亚洲欧美日韩国产一区二区三区| 亚洲精品麻豆| 久久久91精品国产| 性欧美在线看片a免费观看| 久久亚洲精品视频| 久久精品国产亚洲5555| 国产精品色在线| 亚洲靠逼com| 亚洲精品一区二区三区福利| 久久狠狠亚洲综合| 欧美一区二区三区视频免费| 欧美日韩一区二区三区在线 | 伊人久久久大香线蕉综合直播| 亚洲手机成人高清视频| 日韩亚洲综合在线| 鲁大师成人一区二区三区 | 久久久久久婷| 国产精品中文字幕在线观看| 亚洲裸体在线观看| 日韩午夜精品| 欧美成人在线网站| 亚洲国产精品成人精品| 一区免费视频| 久久免费视频在线| 麻豆成人综合网| 在线成人av.com| 久久精品视频播放| 久久三级视频| 亚洲国产99| 欧美成人69| 亚洲经典三级| 艳妇臀荡乳欲伦亚洲一区| 欧美激情综合五月色丁香小说| 亚洲国产精彩中文乱码av在线播放| 在线免费观看日本一区| 老牛影视一区二区三区| 亚洲国产第一页| 一区二区日韩伦理片| 欧美日韩色婷婷| 亚洲一区精品视频| 久久激情五月激情| 国语自产精品视频在线看| 久久电影一区| 欧美成人69av| 一区二区成人精品| 国产精品视频免费观看| 亚洲自啪免费| 欧美日韩精品综合在线| 在线播放亚洲| 久久疯狂做爰流白浆xx| 免费的成人av| 一本一本久久| 国产欧美精品一区aⅴ影院| 欧美一区二区性| 欧美韩日一区二区| 亚洲一本大道在线| 黄色精品一区二区| 欧美精品在欧美一区二区少妇| 亚洲一区二区视频在线观看| 久久青青草综合| 一二三四社区欧美黄| 国产亚洲一区二区在线观看 | 亚洲精品视频一区| 欧美一区二区高清| 亚洲黄一区二区三区| 欧美视频在线观看| 久久人91精品久久久久久不卡| 亚洲精品久久嫩草网站秘色 | 久久精品日韩| 亚洲美女少妇无套啪啪呻吟| 国产日本欧美一区二区三区| 欧美精品aa| 久久av二区| 亚洲小说春色综合另类电影| 欧美不卡视频| 久久成人免费| 亚洲欧美激情四射在线日| 亚洲国产清纯| 国产精品中文字幕欧美| 欧美精品久久99久久在免费线| 欧美在线视频二区| 宅男噜噜噜66国产日韩在线观看| 女仆av观看一区| 久久久久99| 亚洲欧美中文日韩v在线观看| 亚洲欧洲一区二区三区在线观看| 国产亚洲一区二区在线观看| 国产精品久久久亚洲一区|