我想創建一個shared_ptr內容比較函數來代替關聯容器和std算法中的std::less<T>
。我見過使用以下(或類似)模型的自定義比較的幾個例子:我應該擴展std :: less作爲比較函數嗎?
template <typename T>
struct SharedPtrContentsLess {
bool operator()(const boost::shared_ptr<T>& lhs,
const boost::shared_ptr<T> rhs) const {
return std::less<T>(*lhs, *rhs);
//or: return (*lhs) < (*rhs);
}
//defining these here instead of using std::binary_functor (C++11 deprecated)
typedef boost::shared_ptr<T> first_argument_type;
typedef boost::shared_ptr<T> second_argument_type;
typedef bool return_type;
};
但是,爲什麼不是我想要的,而不是延長std::less
?像這樣:
template <typename T>
struct SharedPtrContentsLess : public std::less< boost:shared_ptr<T> > {
bool operator()(const boost::shared_ptr<T>& lhs,
const boost::shared_ptr<T> rhs) const {
return std::less<T>(*lhs, *rhs);
}
};
這會給我買什麼嗎?
我認爲這會讓我免費獲得typedef
s,好像我在擴展已棄用的std::binary_function
。在C++ 03中,我實際上將延伸到std::less
。然而,這也將是從C++ 03移植到C++ 11/14和甚至C++ 17時std::binary_function
將被刪除,因爲它只是在如下的std::less
變化。
我讀過StackOverflow關於std::less
的使用,自定義比較函數,甚至一些標準規格和建議的一堆答案。我看到的std::less
和指導專業化不延長STL容器,但我似乎無法找到擴大反對它std::less
或指導的任何實例。我錯過了一個明顯的理由不這樣做?
編輯:刪除C++ 11標記,因爲它是造成答覆者混淆。我希望獲得可移植性,但C++ 03是必需的。如果您提供了一個僅供C++ 11使用的答案(完全正確),請注意。
您的代碼是否真的要在C++ 03編譯器中編譯?這值得額外的工作嗎? – Yakk
@Yakk:是的,目前我們使用的是GCC 4.4.7,它對C++ 11的支持非常有限。我們想要更新,但是我們還沒有這樣做的複雜原因,包括安全自我認證要求和支持程序,這些程序現在都停留在舊編譯器中。儘管這裏額外的工作是什麼?第一個版本是C++ 11版本的樣子,不是嗎? – BloodGain
@Yakk:我想我明白你的意思了。我不認爲第二個版本是更多的工作。事實上,它看起來工作較少,意圖更清晰,這是我們在代碼中所渴望的東西(即優雅)。它看起來好像更少的代碼和更習慣的C++(在我看來)。如果您認爲第一個版本在兩種標準中都更可取,那麼請詳細說明。畢竟,我就是這麼問的! – BloodGain