C++11新特性(84)-標準庫mem_fn類模板
定製演算法
演算法是C++標準庫中非常重要的部分,C++通過演算法+容器的方式將資料結構和演算法進行了分離。這樣做的好處就是使使用者獲得最大限度的靈活性。
例如下面的Tracer類。
我們可以非常方便的定義儲存Tracer物件的資料結構:
然後非常方便的利用排序演算法進行排序:
程式碼中的compare是另外定義的一個比較函式:
通過這個函式來選擇比較的物件並決定比較的結果。
嚴格講,演算法中要求的並不是函式,而是一個可呼叫物件。參考本連載前面的文章可以知道,可呼叫物件就是可以以fun(a)的形式執行的功能。C++中的可呼叫物件包括函式,函式物件,lambada表示式,引數繫結等,它們都可以作為演算法的引數。
使用function生成可呼叫物件
上面講到的方法非常容易理解,但是稍微有點麻煩,我們希望可以直接使用Tracer的成員函式compare成員函式。這個需求可以使用C++11中引入的function來解決:
function是一個模板,可以指定可呼叫物件的形式。例子中指定了tcomp的形式:返回值為bool,引數為兩個Tracer&。程式碼中將Tracer的成員函式compare賦值給tcomp之後就可以使用它了:
這種情況下,tcomp(t1,t2)動作可以理解為t1.compare(t2)。通過這種方式,我們可以將類的成員函式轉換為可呼叫物件。於是排序程式碼就可以寫成下面的樣子。
使用mem_fn生成可呼叫物件
使用function的方法,還是有點麻煩:雖然&Tracer::compare的簽名已經決定了可呼叫物件的形式,程式設計師還是需要另外指定。解決這個問題的方法是使用mem_fn(注意不是mem_fun)來生成可呼叫物件:
mem_fn會根據成員函式指標推斷可呼叫函式的型別,就省去了另外指定的步驟。
心得體會
哪裡有麻煩,哪裡就會有改進。
程式碼下載地址
https://github.com/xueweiguo/OOThinking/blob/master/20180607%20CallableMemberFunction.cpp
覺得本文有幫助?請分享給更多人。
閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】