1. 程式人生 > >C++11新特性(84)-標準庫mem_fn類模板

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

 

覺得本文有幫助?請分享給更多人。

閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】