2014-04-04 45 views
0

我正試圖在現有的C++應用程序中嵌入python。不過,我試圖從python腳本調用實例成員函數。如何使用Python C/C++接口將實例成員函數作爲PyCFunction類型傳遞

我有一個現有的類,其中我有一個私有成員函數,包裝原生函數並滿足PyCFunction接口。

class MY_CLASS { 
    public: 
     void MY_CLASS(); 
     void submit(TypeA a, int b); 
    private: 
     PyObject* PythonMethod_submit(PyObject*, PyObject*); 
} 

當我創建PyMethodDef我使用的方法的名稱來標識,但是我想我得到一個compliation錯誤表明我有錯誤類型簽名的功能。

MY_CLASS::MY_CLASS() { 
    // Python C/API Intilization stuff 

    PyMethodDef ModuleMethods[] = { 
     { "submit", 
     PythonMethod_submit, 
     METH_VARARGS, 
     "docstring" } 
    }; 

    Py_InitModule("myclass", ModuleMethods); 

    // Further interaction with the embeded interpreter 

} 

如果我使用作爲Python的C API這一過程的工作中所描述的靜態函數,當我使用類成員我收到錯誤斷言PyObject* (MY_CLASS::)(PyObject*, PyObject*) does not match PyObject* (*)(PyObject*, PyObject*)

如錯誤中所述,是否可以將成員函數作爲函數指針傳遞?

回答

1

否。非靜態成員函數的MY_CLASS *隱式傳入(如this),而靜態成員函數的行爲與C函數不同。請參見此頁面以獲取不同類型的簽名:http://www.parashift.com/c++-faq/fnptr-vs-memfnptr-types.html

作爲替代方法,您可以在Python對象中擁有一個成員,該成員向您的C++對象存放指針(MY_CLASS *)。

相關問題