2013-07-26 118 views
0

的一段代碼爲向量運算包含這些類模板定義:爲什麼在操作符<exists時定義lt lt?

template <class T> 
class lt { 
    public: 
    static int compare(T a, T b) { return(a < b); } 
}; 
template <class T> 
class gt { 
    public: 
    static int compare(T a, T b) { return(a > b); } 
}; 

但是,爲什麼?它沒有使用額外的異常處理,並且它依賴於已經具有operator<operator>的類T的對象。使用操作員不僅簡單/容易嗎?或者應該使用模板類進行比較?

+1

沒有看到這是在使用的代碼,很難說的休息,但我希望它的使用使您可以分別選擇「升序排序」和「降序排序」。 –

+0

不知道完整的代碼和背後的設計決策,沒有猜測或具有心理能力,真的沒有辦法回答這個問題。 –

+0

還有一個問題,爲什麼'compare'返回一個'int',而不是'bool'。在標準庫中,'compare'函數根據第一個參數是小於,等於還是大於第二個參數返回int,但是其值小於,等於或大於零。 –

回答

4

每當有人希望二進制謂詞,即遊離函數取兩個參數這些模板可以使用。超載operator<可能不會被定義爲一個自由,二元函數,所以這些模板作爲一種適配器,讓您使用現有的運營商,不管他們是如何定義的,只要表達a < b可以解決。

注意,標準已經提供了非常相似的*模板;它們被稱爲std::lessstd::greater,它們被用於例如有序的關聯容器。

*)標準庫謂詞提供他們的三分球是如何工作的額外保障。

+2

謂詞必須重載'operator()'。 –

+0

這正是在std :: less [http://www.cplusplus.com/reference/functional/less]中發生的事情!非常好,謝謝! –

+0

@VasilyBiryukov:在OP的情況下,你會使用'&GT :: compare'作謂語,而不是'GT ()'。 –

0

事情是,比較不總是numerical.Sometimes兩個對象可被比較和比大於或小於可以在類,用於保存型座標的對象具有。例如新定義比較可以用自定義的方式定義。 例如:

Coordinate c1(3,5) 
Coordinate c2(4,2) 

我們可以重載> operatorc1>c2返回True每當c1.x > c2.xc1.y>c2.y

+0

這就解釋了爲什麼你可能需要定義/重載'operator>'而不是使用額外的類模板。 –

+1

@alle_meije模板是定義您打算在其上進行比較的類的通用方法。在這種情況下,'Coordinate'就是一個例子。 ''代表一個任意的類。 –