2012-12-06 51 views
1

Possible Duplicate:
demote boost::function to a plain function pointer如何從`boost :: function <var(void *,var)>`獲取C指針(如`var(*)(void *,var)``)?

於是我就用Flash C++ Compiler (aka flascc, alchemy)和就吃這樣的代碼:

boost::function<var (void*, var)> f = boost::bind(&as3_socket::socket_socketData, this, _1, _2);     
socket->addEventListener(flash::events::ProgressEvent::SOCKET_DATA, Function::_new(f, NULL)); 

得到下一個編譯器錯誤:

$ g++ $JN -static -emit-llvm -c src/utils/http/as3_socket.cpp -I../boost/boost_libraries/install-dir/include 
src/utils/http/as3_socket.cpp: In constructor ‘as3_socket::as3_socket()’: 
src/utils/http/as3_socket.cpp:75: error: no matching function for call to ‘AS3::ui::Function::_new(boost::function<AS3::ui::var()(void*, AS3::ui::var)>*, NULL)’ 
/cygdrive/c/Users/Avesta/Downloads/FlasCC_1.0.1134176_11-09-2012/sdk/usr/bin/../../usr/include/AS3++/builtin.h:179: note: candidates are: static AS3::ui::Function AS3::ui::Function::_new() 
/cygdrive/c/Users/Avesta/Downloads/FlasCC_1.0.1134176_11-09-2012/sdk/usr/bin/../../usr/include/AS3++/builtin.h:180: note:     static AS3::ui::Function AS3::ui::Function::_new(AS3::ui::var (*)(void*, AS3::ui::var), void*) 

所以現在的問題是如何從boost::function<var (void*, var)>多個C風格得到var (*)(void*, var)

+0

請有人創建flascc標記... – myWallJSON

+1

http://stackoverflow.com/questions/282372/demote-boostfunction-to-a-plain-function-pointer是你想要的? –

+0

錯誤來自g ++。無關緊要,你通過flascc調用它。無論您想將輸出轉換爲閃光燈都無關緊要。這是一個簡單的C++問題。 –

回答

1

簡短的回答是「你不能」。

一個boost函數對象可能只包含一個函數指針,但它可能是在某些其他函數類型上調用boost::bind()並綁定了一些參數的結果。它也可能包含一個函數對象。

僅僅因爲你可以稱它爲一個指向函數的指針並不意味着它是一個指向函數的指針。

[只注意到 - 鏈接到其他的問題非常詳細解釋了以上這]

0

你是問錯了問題。

boost::function是一種表達「在未來做某事」的方式,但它不是指向C++函數的指針。我太強大了,不適合作爲函數的指針。

但是,您的回調接口是一個C++函數,需要一個void指針和其他東西。通常你用void指針和函數指針來提供回調。

因此,您所做的是創建一個函數,將void指針轉換爲對象,然後將該對象的其餘參數傳遞給該對象。

確保您投下的類型無效並返回相同。

你甚至可以將指向boost::function的指針變成void ptr。

請注意,這會讓您遇到管理指向對象的良好生命期的問題。吮吸不是嗎?