我有下面簽名C庫函數功能,性病工作::對C庫
void register_callback(void (*callback)(int, void*), void* args);
是什麼讓這一起工作,如果我有以下形式的回調的最佳方式,
std::function<void(int)>?
我有下面簽名C庫函數功能,性病工作::對C庫
void register_callback(void (*callback)(int, void*), void* args);
是什麼讓這一起工作,如果我有以下形式的回調的最佳方式,
std::function<void(int)>?
std::function<void(int)> bob;
register_callback([](int x, void* pbob){
auto& bob = *static_cast<std::function<void(int)>*>(pbob);
bob(x);
}, &bob);
這仍然有效,只要變量bob
一樣。
bob
的副本是不夠的,我們在register_callback
調用中指向的bob
的實際實例必須足夠長。
如果這很困難,可以考慮一個智能指針,指針std::function
並指向存儲的std::function
。
上面將會有適度的開銷,因爲我們派遣一個函數指針,然後通過一個vtable的等價物,然後再次在std::function
之內。
高於自己的事情是,我做一個無狀態的拉姆達到void* args
與int
轉換爲指針,TO-std::function
,並調用該std::function
。無狀態lambda可以隱式轉換爲函數指針。
謝謝。你能詳細闡述一下你使用智能指針的建議嗎?你是否想要在堆上創建一個std :: function對象並用智能指針來包裝它?但那麼我將不得不確保智能指針保持有效的權利? –
@ vikky.rk是的,但智能指針的副本表示指向元素的指針保持有效;不像'std :: function'的副本。所以有點容易處理。 – Yakk
有道理。還有一個問題:當它被轉換爲函數指針時,lambda存儲在哪裏? –
有了:
class CallBack
{
public:
explicit CallBack(std::function<void(int)> f) : f(f) {}
static void to_c_api(int a, void* that)
{
reinterpret_cast<CallBack*>(that)->f(a);
}
private:
std::function<void(int)> f;
};
然後你可以做
CallBack callback; // should live longer than the calls
void register_callback(CallBack::to_c_api, &callback);
也許[這](http://stackoverflow.com/questions/10938774/get-function-pointer-from-stdfunction- when-using-stdbind)有幫助。 – Downvoter
我假設'void * args'是用於userdata的,你可以將其轉換回你的類型。 – Jarod42
是你的註冊回調**實際上**'void register_callback(void(* callback)(void *,int),void * args)'有沒有機會?如果是,請更正。如果否,請提供有關回調如何工作的更多信息,以及參數的含義。理想情況下,實際上在這裏複製粘貼實際的回調接口,請勿複述。 – Yakk