2011-11-20 120 views
3

香港專業教育學院一直使用Python和C++在一起有一段時間了,但從來沒有嘗試過實現的東西如下:Python函數作爲參數傳遞給C++暴露類使用::升壓::蟒蛇

標識像蟒蛇用戶能夠寫類似:

def foo(a,b): 
    return a+b 

myclass.myfunc(foo) 

其中MyClass的是一個C++類暴露於蟒與Boost.Python的,條件是取一個函數與它的方法(MYFUNC):

int func(int,int) 

簽名,只有這一點。

這可能嗎?

林想着聲明:

myclass::myfunc(boost::python::object) 

並提取Typedef的函數簽名,但我只是猜測..

也許有更好的/可行的辦法做到這一點,也許有些「函數'對象?

+0

也許一個更好的標題會是「蟒蛇功能參數,以提高:: python的C++類暴露」 – user815129

+1

這是一個有趣的問題,我很好奇,想看看回答。 – Omnifarious

回答

3

你幾乎猜到了答案。 Python函數實際上只是boost::python::object實例。然後你可以只有一個boost::function<int (int, int)>並把Python對象放在裏面。

我剛剛安裝我的操作系統,我沒有加速,所以我不能測試它,但我認爲,如果你只是這樣做(沒有任何包裝函數),它會工作:

void function(boost::function<int (int, int)> func) { 
    // ... 
} 

// And then you expose the function as you normally would 

我期望上面的工作;如果沒有這肯定會:

void function_wrap(boost::python::object func) 
{ 
    auto lambda = [func](int a, int b) -> int { 
     return boost::python::extract<int>(func(a, b)); 
    }; 
    function(boost::function<int (int, int)>(lambda)); 
} 

// And then you expose the wrapper, not the original function 
+0

這就是我之後..虐待測試它並儘快結果,謝謝 – user815129

+0

有趣。如果'func'不是可調用的,'boost :: python'會做什麼?我認爲:: boost :: python :: object有一個模板化的'operator()'版本來完成這個工作。 – Omnifarious

+0

@Omnifarious是的,有一個模板化的operator()'。如果對象不可調用,則會拋出異常(我不記得它被調用的是什麼) - 與嘗試在Python中調用不可調用對象時發生的情況幾乎相同。 –

相關問題