哪些地方需要使用B2F

2021-05-27 13:42:07 字數 1407 閱讀 3686

剛剛寫好了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埠。這個是資料庫引擎的埠,如果我們要遠端連線資料庫引擎,那麼就需要開啟該埠。這個埠是可以修...