我寫了乙個函式,它要需應用乙個生成整數隨機數的隨機數發生器作為引數。然後寫了乙個函式來根據引數生成不同分布的隨機數發生器,供前乙個函式應用。我用調了boost庫的一些基於特定概率分布的隨機數生成函式,但是有很多函式的結果是double型的。
我的函式將隨機數發生器定義為boost::function型別。很明顯那些生成double的函式不能直接通過bind operator()的式方失掉,而要需型別轉換。而這個應用bind/function的巢狀用調就較比麻煩了。
設假我有兩個函式:
int trans(double);
double gen();
我希望的結果是失掉乙個函式象對:它應用gen生成原始數字,然後用trans函式把它轉成形整返回;即失掉乙個這樣的函式:
int fun()
我這裡還是無引數的,所以欠好應用lambda表示式。
這個問題解決許久,心傷啊,程序就略過了,直接說終最方法。
設假應用面前的函式明聲,那麼這個函式象對應當這麼生成:
每日一道理
「上下五千年,龍的看火不滅;古有愚公志,而今從頭越…… 」站在新世紀的門檻上,我們的追求就是讓祖國燦爛的喜悅飛揚在美好的明天……
boost::functionfun=boost::bind(trans,boost::bind(gen));
其中要應用兩次bind!
內層的那個看似沒什麼用,但是如果不適用它的話,boost不會為以我們要定綁的第乙個引數是乙個函式,而是為以我們要定綁乙個體具的值,這個數字的值由這個gen函式生產。這時編譯器會報「沒法將double(void)型別轉換為double型別」的錯誤。
樣同的其他引數式形的(要需應用lambda庫)、多層的函式巢狀定綁,都應當意注要把內層的函式通過bind釀成乙個可傳遞的象對,而不能直接寫函式名!
bind定綁的各個西東都是象對(括包基本資料型別),是不支援把引數直接定綁為函式的,要這邊做必須先把函式釀成可以由自傳遞的象對!
另外不要為以你的引數已經是函式象對了就能夠直接寫了,還要再寫bind(),體具因原還不清晰。
1,static_cast()是運算子而不是函式!所以不能定綁。
2,boost/lambda/casts.hpp供給的ll_static_cast雖然是函式,但是要需意注的是它是有兩個模板引數的模板函式,在定綁的時候我們不能給出引數的現實型別(外側的bind函式給ll_static_cast供給的是funnction的型別而不是int),因而也不能應用ll_static_cast,要自己寫轉換函式。
3,bind和lambda/bind有衝突,而且很多功能疊重,用乙個就好了。
文章結束給大家分享下程式設計師的一些笑話語錄: 一條狗在街上閒逛,看見櫥窗裡一張告示:「招聘程式設計師。會程式設計,有團隊精神,至少精通兩種語言。均等機會。」
那條狗就進去申請,但是被拒絕了。
「我不能僱一條狗在公司裡做事。」經理說。
狗不服氣,指著告示上「均等機會」幾字**。
經理沒法,嘆了口氣,不屑地問道:「你會程式設計嗎?」
那條狗默默地走到電腦前,編了個程式,運作準確。
「你有團隊精神嗎?」經理問。
那條狗掉頭看了看門外,一大群野狗在外面虎視耽耽。
「我真的不能僱狗做這份工作。」經理氣急敗壞地說。
「就算會程式設計、有團隊精神,但是我需要的雇員至少要能精通兩種語言。」
那條狗抬頭看著經理說:「喵-噢。」
標準庫bind函式
1.作用 bind可以看做乙個函式介面卡,它接受乙個可呼叫物件,生成乙個新的可呼叫物件來適應原物件的引數列表。2.語法auto newcallable bind callable,arg list arg list是乙個逗號分割的引數列表,對應給定的callable引數。當我們呼叫newcallab...
boost庫編譯引數小結
32位編譯 從開始選單啟動visual studio 2013的vs2013 命令列,進入boost所在目錄,執行bootstrap.bat 編譯命令 例 bjam.exe stage toolset msvc 12.0 without math stagedir vc12 x86 link sta...
C 標準庫bind函式
上篇部落格在為大家介紹lambda是先由find if函式引入問題,由於find if函式的第三個引數所要求的可呼叫物件只能由乙個謂詞,所以我們最後選擇的解決方法是用lambda表示式。那麼此問題還有其他的解決方法麼?本篇部落格我就為大家帶來新的解決方法bind函式 bind函式的最根本的作用就是可...