剛剛寫好了boost::bind到boost::function的自動推導工作,很是興奮。下面就是怎麼用的問題了。
首先看它究竟方便了什麼。
設想你有一組介面,實現乙個retry的功能。包括:驗證某個函式是否執行成功,執行成功出線成功的提示;執行失敗出現失敗的提示,並同時提示重試。
如果這麼寫
begin:
if(do_something()) show_success_widgets();else if(show_failure_widgets()==retry) goto begin:;
這麼寫,很難將這樣一組模組作為乙個整體重複利用,每次要寫類似的邏輯。
如果我們把do_something作為乙個命令丟給相應的模組,就很容易解決這樣的問題。
class reuse_retry_ui
private:
functionm_trycmd;
}這樣我們在需要重試函式的時候就可以簡單的呼叫這個widget的集合,而不用自己去組織widget的出現順序。
reuse_retry_ui_obj.try_command(bind(&test,this));
這樣看起來一切都完美了。
事情總是變化的,忽然有一天,乙個新需求來了,這個command需要乙個引數,是乙個檔名。別的都一樣,就需要加乙個輸入框就好了。
那修改我們的reuse_retry_ui,加乙個成員函式和乙個成員變數m_filetrycmd;
實現很簡單,可是很遺憾,編譯不過。
因為對於過載的try_command, bind出來的物件和哪個都可能match,解決的方法有兩種,一種就是別用try_command這個名字了,換個try_command_1,呼叫者呼叫try_command_1。這種方法不錯,但是隨著日子的增多,我們也許會有try_command_2, try_command_3........。我們使用這種模式介面簡單的優點就慢慢消失了。
還有一種辦法就是讓使用者指定bind之後的function物件型別。
就需要使用者呼叫的時候這樣指定: try_command(function(bind....)),問題解決了,但是不是特別爽,而且如果function型別指定的和bind的不match, 又是一堆編譯錯誤。
如果我們有了b2f, 事情就簡單了。
template
try_command(t cmd)
template<> try_command(functioncmd) //same as try_command_0
template<> try_command(functioncmd) //same as try_command_1
..... any other extensions.
這樣,使用者所有的呼叫方式都是:
try_command(bind.....);
簡單,就是我們想要的。
Spring哪些地方需要註解
1.要理解為什麼不用注入,首先就清楚注入的目的是什麼?如果不注入,在程式中要使用某個類物件的方法,則需要去new乙個物件。然後我們呼叫其中的方法。2.眾所周知 程式 演算法 資料 不失一般性,在物件導向開發中,類一般有兩種,一種是功能類的,主要是完成一些業務操作。一種是資料類,主要是儲存資料,比如p...
機房存在哪些安全隱患?需要排查哪些地方?
隨著如今的網際網路和大資料時代不斷發展,很多企業開始建設自己的機房,用於儲存資料 執行系統等,機房安全 高效的執行,可以保障網路和通訊的安全暢通,因此,機房安全必須引起足夠的重視,但機房安全隱患您了解嗎?下面給大家總結機房存在的安全隱患以及解決的方法。機房需要進行安全隱患排查的地方 1 逐個局點 機...
SQL Server到底需要使用哪些埠
sql server在安裝到伺服器上後,由於出於伺服器安全的需要,所以需要遮蔽掉所有不使用的埠,只開放必須使用的埠。下面就來介紹下sql server 2008中使用的埠有哪些 首先,最常用最常見的就是1433埠。這個是資料庫引擎的埠,如果我們要遠端連線資料庫引擎,那麼就需要開啟該埠。這個埠是可以修...