比较器,用于分类,专业化

时间:2019-05-28 15:16:52

标签: c++ templates

在模板函数中,必须对std :: vector进行排序。 T可以是简单类型,也可以是std :: pair,例如

std::vector<double> or 
std::vector<std::pair<int,Something> >

如果T是一对,则仅第一个元素应进行比较。两种情况下如何实现比较器?

我尝试过:

template<typename T>
inline bool smaller(const T& a,const T& b)
{
    return a<b;
}

template<typename T,typename S>
inline bool smaller(
    const std::pair<T,S>& a,
    const std::pair<T,S>& b
    )
{
    return a.first<b.first;
}

template<typename T> inline void function(std::vector<T >& vVec)
{
...bla...
sort(vVec.begin(),vVec.end(),smaller<T>);
...bla...
}

,但是这种方式不起作用。我也尝试过专门化,但是找不到合适的语法来专门化smaller()函数。

2 个答案:

答案 0 :(得分:3)

您可以将其包装在lambda中:

std::sort(vVec.begin(),vVec.end(), [](const auto& a, const auto& b) { return smaller(a, b); });

答案 1 :(得分:3)

一种简单的解决方法是使smaller结构的两个opeator()函数smaller都具有。使用

struct smaller
{
    template<typename T>
    bool operator()(const T& a,const T& b)
    {
        return a < b;
    }

    template<typename T, typename S>
    bool operator() (const std::pair<T, S>& a, const std::pair<T, S>& b)
    {
        return a.first < b.first;
    }
};

允许您像这样将smaller传递给sort

template<typename T> inline void function(std::vector<T >& vVec)
{
    sort(vVec.begin(),vVec.end(),smaller{});
}

,在sort中,重载分辨率将在两个较小的operator()上起作用,对于任何std::vector<std::pair>,将调用std::pair重载。