2015-06-05 33 views
0

是否有可能創建一個函數,該函數接受任何可想象的類型的元素列表並返回可用作排序元素的比較器的運算符?換句話說,是否可以創建一個通用元素列表的排序?

template typename<T> ??? getComparator (T a) 
{ 
    // ... 
} 

這裏我把???,因爲我不知道返回類型是什麼。這個想法,但是,如果我叫

getComparator(int i) 

它可能會返回

bool smallerThan(int a, int b) { return (a < b); } 

,如果我創建了一個自定義對象

struct thingamabob { int i; std::string s; int ***** ptr; } 
thingamabob myThing; 

我可以養活myThinggetComparator,它將弄清楚如何創建一個返回類型爲bool的函數,該函數需要兩個myThing類型的對象,並且對於任何3個對象都是這樣的

thingamabob thing1, thing2, thing3; 

thing1 != thing2 && thing2 != thing3 && thing1 != thing3 

話,我可以得到一些<使得或者

thing1 <= thing2 && thing2 <= thing3 

thing1 <= thing3 && thing3 <= thing2 

thing3 <= thing1 && thing1 <= thing2 

thing2 <= thing1 && thing1 <= thing3 

thing2 <= thing3 && thing3 <= thing1 

thing3 <= thing1 && thing1 <= thing2 

thing3 <= thing2 && thing2 <= thing3 

回答

0

C++沒有這樣的功能(截至2015年,因此包括所有標準直到C++ 14)。但是,Bjarne Stroustrup已經寫了一個建議,將default comparison operators添加到標準中。

這實質上是爲您生成一個比較運算符,以防您自己不聲明這些運算符。它只是您的類/結構的數據成員的字典順序。然而,目前在任何主流編譯器中都沒有實現這個功能,也不能肯定它會被添加到官方的C++標準中。你必須堅持自己實施它。

該提案定義了一些不會產生默認比較運算符的情況,例如,如果有指針成員。這是因爲這樣的比較可能很容易引起未定義的行爲。

,做的簡單的代碼完全是:

bool operator<(const Type& first, const Type& second) 
{ 
    return std::tie(first.member1, first.member2) < 
      std::tie(second.member1, second.member2); 
} 

bool operator>=(const Type& first, const Type& second) 
{ 
    return !(first < second); 
} 

bool operator>(const Type& first, const Type& second) 
{ 
    return second < first; 
} 

bool operator<=(const Type& first, const Type& second) 
{ 
    return !(first > second); 
} 
+0

引用的建議沒有產生比較運營商的任意類型。例如,帶有指針成員的類型被排除。 – rici

+0

@rici是的,這實際上是非常好的:比較屬於不同內存塊的指針就是UB。 – stefan

+0

當然,我明白理由。這只是一個澄清,因爲OP是關於任意對象的。 – rici

1

我很確定你在尋找std::less<T>:這是一個函數對象,它將比較T類型的兩個對象。

但是,它將需要operator<定義 - 這將工作正常int,但對於thingamabob - 您將不得不編寫該運算符自己。編譯器如何知道你的意思是說一個thingamabob比另一個要小,除非你告訴它?

相關問題