是否有类似“默认比较器”的东西?

for*_*818 4 c++ compare

我编写了一个包装 std::vector 的模板,以确保向量始终排序:

template <typename T> class SortedVector{
public:    
    SortedVector(bool (*comparator)(T,T)=DefaultComparator<T>){
        this->comparator = comparator;
    }
    void insertValue(T newElement){            
        vect.insert(std::lower_bound(
           vect.begin(),vect.end(),newElement,comparator),newElement);
    }
private:
    std::vector<T> vect;
    bool (*comparator)(T,T);
};
Run Code Online (Sandbox Code Playgroud)

我希望能够使用自定义比较器,但在大多数情况下,只需使用T's<运算符就可以了。但是,我没有找到比使用这个更好的方法

template <typename T> bool DefaultComparator(T a,T b){return a<b;}
Run Code Online (Sandbox Code Playgroud)

作为默认参数。

也许这是一个愚蠢的问题...是否有更好的方法可以在不定义我自己的情况下获得相同的结果DefaultComparator

我无法使用 C++11。

Mik*_*our 5

没有一个标准的函数模板可以做你想做的事情;但有一个标准的函数模板,std::less. 如果您要使用通用函数对象,而不是将自己限制为函数指针,那么很容易将其指定为默认值:

template <typename T, typename Comparator = std::less<T> > 
class SortedVector{
public:    
    SortedVector(Comparator comparator = Comparator()){
        this->comparator = comparator;
    }
    void insertValue(T newElement){
        // lower_bound accepts any suitable function object, so no change needed
        vect.insert(std::lower_bound(
           vect.begin(),vect.end(),newElement,comparator),newElement);
    }
private:
    std::vector<T> vect;
    Comparator comparator;
};
Run Code Online (Sandbox Code Playgroud)

  • @black:没有默认参数的版本被标记为“until C++14”。它在 C++98 和之前的 STL 中可用。现在它已被替换为(向后兼容)版本,如果您不指定参数类型,则该版本会推导参数类型,并且如果您指定参数类型,则其行为与以前完全相同。 (5认同)