2016-11-02 34 views
7

爲了基於該y值一些標準集裝箱Container<T>的Comparer是需要的有用屬性

struct T{ 
    int x,y; 
}; 

使用標準的功能像std::sort,你需要寫類似的信息(例如):

std::vector<T> v; 
//fill v 
std::sort(v.begin(),v.end(),[](const auto& l,const auto& r){ 
    return l.y<r.y; 
}); 

寫成lambda函數的比較器用得太多,並且在各種類和屬性的代碼中一遍又一遍地重新編寫。

考慮其中y的類型是可比較的(無論是像int或存在用於< operator過載),是否有任何的方式來實現的東西等的情況下:

std::sort(v.begin(),v.end(),imaginary::less(T::y)); // Imaginary code 

是否有可能在C++來寫如less這樣的函數?或類似的東西?

我在問,因爲我在一些託管語言(我不確定也許C#或Java)中記得類似的東西。但是,如果它是真實的,我甚至不確定這個信息。

+2

你會很樂意與代碼,允許你說'member_less ()'? –

+0

@Nathan:但是這不允許你在調用'std :: sort'的時候選擇排序的成員。 –

+0

@ BenVoigt啊。我沒有看到那是OP想要做的。傻我。 – NathanOliver

回答

7
template<typename T, typename MT> 
struct memberwise_less 
{ 
    MT T::* const mptr; 
    auto operator()(const T& left, const T& right) const 
    { return (left.*mptr) < (right.*mptr); } 
}; 

template<typename T, typename MT> 
memberwise_less<T, MT> member_less(MT T::*mptr) 
{ 
    return { mptr }; 
} 

,然後你可以做

std::sort(v.begin(), v.end(), member_less(&T::y)); 
+0

這是沒有編譯測試...如果你共享一個測試用例,創建矢量,打印結果等,我很樂意將其添加到測試中。 –