2009-11-20 70 views
1

我從python的C++應用程序中做了一些綁定。Swig(或Boost :: Python)中的成員指針

問題是我使用指向成員的指針(它用於計算最短路徑並將屬性最小化爲參數)。

這是C++簽名:

std::vector<Path> martins(int start, int dest, MultimodalGraph & g, float Edge::*) 

這是我做的(從我在doc理解):

%constant float Edge::* distance = &Edge::distance; 

這是我打電話給我的功能從蟒蛇:

foo.martins(0, 1000, g, foo.distance) 

這是錯誤我得到:

NotImplementedError: Wrong number of arguments for overloaded function 'martins'. 
Possible C/C++ prototypes are: 
martins(int,int,MultimodalGraph &,float Edge::*) 

我有一個重載的方法,使用默認的第四個參數,它完美的工作。

那麼有可能使用swig指向成員的指針嗎?如果是的話,有什麼竅門?如果不是,那麼最合適的工作方式是什麼?

謝謝你的幫助!

更新:如果有人知道Boost :: python是否確實如此,我會切換到它。

回答

2

不知道痛飲,但的boost :: Python中可以編寫一個包裝:

bool foo(int x, float* result); 

boost::python::tuple foo_wrapper(int x) 
{ 
    float v; 
    bool result = foo(x, &v); 
    return boost::python::make_tuple(result, v); 
} 

BOOST_PYTHON_MODULE(foomodule) 
{ 
    def("foo", &foo_wrapper); 
} 

而在Python中,你會:

result, v = foomodule.foo(x) 

由於在Python彩車是不可改變的,你實際上不能將一個方法傳遞給一個方法,並期望該方法改變浮點值,所以我們調整代碼以返回一個值的元組。

+0

謝謝你的回答。但是如果我把它做對了,用這種方法你只需要傳遞一個變量的引用。 我想傳遞一個指向類成員的指針。不是給一個實例成員。 我有一個類C {int a; int b;};然後你可以調用foo(c,&C :: a)或foo(c,&C :: b),這取決於你想讓你的函數使用成員函數a或實例c上的類C的成員b。 – 2010-02-07 15:03:20

+0

在這種情況下,我不知道如何包裝你的方法,因爲在包裝過程中你需要一個C實例。你真的需要指向類成員的指針嗎?難道你不能改變你的設計接受一個int而不是? – 2010-02-08 16:37:26

+0

這就是我所做的。但我不滿意。最大的想法是有一個具有各種成本的圖形,我想要一個算法以運行成本作爲參數運行(對於每個邊,算法將根據參數選擇好的變量)。 我覺得我太野心勃勃了。很可能python的層次太低,並且不允許爲C++提供模板和成員指針的抽象。 我仍然接受答案。感謝您的努力:) – 2010-02-09 16:15:44