我想爲可以處理多種數據類型的Matlab編寫一個C++ mex函數。 Matlab給我一個mxArray*
,從中我可以檢索數據的void*
,以及一個mxClassID
告訴我數據類型。所以,我可以這樣做:C++解碼void指針很好用於Matlab mex
void *data = mxGetData(mxarray);
switch (mxGetClassID(mxarray)) {
case mxDOUBLE_CLASS:
my_function(static_cast<double *>(data));
...
my_function
是模板化,所以這很好地處理不同的數據類型。但它仍然是非常煩人的需要有這個開關的每一個可能的my_function1
,my_function2
等
到目前爲止,我提出的解決方案是使用功能的方法,並有一個方法,接受函子:
template <typename ReturnType, typename FunctorType>
ReturnType mxarr_apply(const mxArray *inarr, FunctorType functor) {
void *data = mxGetData(inarr);
switch (mxGetClassID(inarr)) {
case mxDOUBLE_CLASS:
return (ReturnType) functor(static_cast<double *>(data));
...
這樣我可以把我的邏輯函子(帶operator()
模板),而不必一遍遍重新開關。
但我想知道是否有其他方法嗎?在Java中,我認爲我只需要一個將mxClassID
直接轉換爲class
引用的函數,然後該函數可以在運行時用於實例化類型,但這似乎不是C++中的一個選項。
+1 ..並且最好是最多一次 – stijn
非常感謝。而爲了只寫一次開關,仿函數的方法就行了嗎?或者還有其他選擇嗎?處理輸出時,這種設置會變得特別痛苦。在許多情況下,我發現我僅限於基於副作用的輸出。 – Chinasaur