2012-12-22 108 views
2

我有我試圖轉換爲一個void *以下TR1 ::函數原型:鑄造一個TR1 ::函數爲void *

typedef std::tr1::function<cv::Mat (const cv::Mat,const void*)> preprocessingFunc; 

在此功能,我將其存儲在一個向量包含結構表示的功能,功能類型和指針:

void ImageGraph::addNode(preprocessingFunc func) 
{ 
    NodeFunction nodeFunction = { typeid(func), (void*)func }; 
    //nodes.push_back(nodeFunction); 
} 

的錯誤,我得到:

ImagePipeline.cpp: In member function ‘void IP::ImageGraph::addNode(IP::preprocessingFunc)’: ImagePipeline.cpp:32: error: invalid cast from type ‘IP::preprocessingFunc’ to type ‘void*’ /usr/include/c++/4.2.1/typeinfo:135: error: ‘std::type_info::type_info(const std::type_info&)’ is private ImagePipeline.cpp:32: error: within this context

是有可能將此函數類型轉換爲指針(void *)?如果沒有,是否有更好的方法來實現我正在做的事情?

爲了清晰起見,我在稍後的日期存儲函數指針以調用,它們目前有3種類型的函數指針,但是我想將它們全部存儲在同一個向量中。

+2

編號'tr1 :: function'是一個類,而不是函數指針。對象'func'不能變成'void *'。 –

+0

@BoPersson:我不追隨; 'void *'可以保存包含'tr1 :: function'對象的任何對象的指針。混合代碼和數據指針會很麻煩,但是你正確指出的'std :: function'不是函數指針。 (它_一個)。 – MSalters

回答

1

指向成員函數的指針不能存儲在函數指針中,因爲實質上,成員函數具有隱藏參數(「this」指針)。有兩種解決方案:一種是真正的「指向成員函數的指針」(它需要正確類型的函數指針),或者使函數成爲靜態,並將對象本身作爲指針(例如void)傳入。

對我來說,這看起來像是一種奇怪的解決方案,我認爲有更好的解決方案,例如使用接口類,並將接口對象添加爲「節點」,也許?

對於多一點的「成員函數指針」,看看這裏: http://www.parashift.com/c++-faq/fnptr-vs-memfnptr-types.html

但考慮下面的評論,你實際上是試圖存儲對象中的指針。這與(void *)3.1415926;類似 - 它沒有任何意義。你可能不應該在這裏使用void *,而是別的東西,比如指向函數<>的指針[並且改變你的addNode以獲得一個預處理函數對象的指針]。

+0

對不起,整個答案是正確的,但並不適用。 'IP :: preprocessingFunc'不表示指向成員函數的指針,但是是作用域IP中的typedef。 – MSalters

+0

啊,好點。 –

0

你似乎從錯誤的一端接近它。你爲什麼使用void*?你聲明你有「目前3種類型的函數指針」。要存儲可調用的東西,請使用tr1::function<>。它可以從最合理的來源初始化:函數指針,成員函數的綁定指針,函子,以及其他tr1::function s