c++裡的bind和lambda,為什麼沒辦法變成c-style function ...
文章推薦指數: 80 %
在c裡面,function pointer是一個儲存function位置的指標,可以拿來pass一個function讓別人呼叫,通常用來實作callback function。
c++裡的bind和lambda,為什麼沒辦法變成c-stylefunctionpointer2019/12/17C/C++共2501字,約8分鐘在c裡面,functionpointer是一個儲存function位置的指標,可以拿來pass一個function讓別人呼叫,通常用來實作callbackfunction。
例如natsclib裡的errorhandling,為了識別或做一些hacky技巧,還會指定一個void*讓它傳回來。
關於void*,最直觀的例子就是pthread_create裏頭的parameter了,例如這個的example然而有些設計不良的API是沒有提供這個實用的方式的,於是我開始尋找使用C++的方式把這個東西丟進去,例如bindtypedefvoid(*handler)();
voidrun(handlerh)
{
h();
}
voidgg(inti){}
intmain(){
run(bind(gg,3));
return0;
}
然後編譯器就生氣了error:cannotconvert‘std::_Bind_helper
intmain(){
function
沒辦法了,試試看lambda吧。
intmain(){
inti=3;
function
到底是為什麼呢,只好來仔細的研究看看。
先從bind開始吧,c++有個半殘但勉強能用的東西可以揭開他們的真面目..typeid(x)inti=3;
autolambda=[i](){};
autob=bind(gg,i);
function
也就是說std::function應該視為function的interface用來進行傳遞和呼叫。
而lambda就沒有實際出現在c++header裡了,不過在cppreference裡就有基本的說明Constructsaclosure:anunnamedfunctionobjectcapableofcapturingvariablesinscope.
lambda也是個functionobject,但與bind最大的差別在bind要提供一個具名的function,但lambda儲存的是匿名function,並且是由編譯器幫忙完成的,相對的bind是藉由template展開來完成。
文件訊息作者:JiaJunYeh連結:https://xnum.github.io/2019/12/cpp-function/本著作係採用創用CC姓名標示-非商業性-相同方式分享3.0台灣授權條款授權.SearchTableofContents
延伸文章資訊
- 1C++ 中的Lambda 運算式
ISO C++ 標準顯示將傳遞為 std::sort() 函式第三個引數的簡單Lambda: ... that shows how to use lambda expressions with ...
- 2In C++, what is the reasoning behind not allowing function ...
I'm not a C++ programmer, but wouldn't that cause loss of information? I mean, the lambda also ha...
- 3Passing C++ captureless lambda as function pointer to C API
A lambda expression with an empty capture clause is convertible to a function pointer. It can rep...
- 4Lambda expressions in C++ - Microsoft Docs
- 5Passing C++ captureless lambda as function pointer to C API