函式引數Boost庫bind函式的巢狀呼叫

2021-09-06 09:09:38 字數 1697 閱讀 3143

我寫了乙個函式,它要需應用乙個生成整數隨機數的隨機數發生器作為引數。然後寫了乙個函式來根據引數生成不同分布的隨機數發生器,供前乙個函式應用。我用調了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函式的最根本的作用就是可...