获取所需属性的比较器

Comparer that takes the wanted attribute

本文关键字:比较器 属性 获取      更新时间:2023-10-16

为了在一些标准容器Container<T> 上使用类似std::sort的标准函数

struct T{
    int x,y;
};

基于y值,您需要编写类似(例如(:

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(。然而,我甚至不确定这些信息是否属实。

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));