std :: set在运行时选择更少或更大的比较器

Mik*_*Mik 5 c++ stl predicate set

我正在重构一些代码,发现有两个地方可以使用相同的代码编写,除了一组的比较器less<double>在一个地方而greater<double>在另一个地方.就像是:

double MyClass::Function1(double val)
{
    std::set<double, less<double> > s;
    // Do something with s
}

double MyClass::Function2(double val)
{
    std::set<double, greater<double> > s;
    // Do the same thing with s as in Function1
}
Run Code Online (Sandbox Code Playgroud)

所以我想到了:

double MyClass::GeneralFunction(double val, bool condition)
{  
    if(condition)  
    {  
        // Select greater as comparator  
    }  
    else
    {  
        // Select less as comparator  
    }  

    set<double, comparator> s;  
    // common code
}
Run Code Online (Sandbox Code Playgroud)

我通过使用我的自定义比较器函数使它工作,如下所示:

bool my_greater(double lhs, double rhs)
{
    return lhs > rhs;
}

bool my_less(double lhs, double rhs)
{
    return lhs < rhs;
}

double MyClass::GeneralFunction(double val, bool condition)
{ 
    typedef bool(*Comparator) ( double,  double);
    Comparator comp = &my_less;
    if (condition)
    {
        comp = &my_greater;
    }

    std::set<double, Comparator > s(comp);  

    //....
}
Run Code Online (Sandbox Code Playgroud)

但我想使用内置的.问题是我不知道如何声明比较器并为其分配内置谓词.

任何帮助将不胜感激.

MSa*_*ers 4

您真的需要运行时检查吗?

template <class Comp> double MyClass::Function(double val)
{
    std::set<double, Comp > s;
    // Do something with s
}
Run Code Online (Sandbox Code Playgroud)

即使这样做,您仍然可以使用

double MyClass::Function(double val, bool comp)
{
   return comp ? Function<std::less<double> >(val) : Function<std::greater<double> >(val);
}
Run Code Online (Sandbox Code Playgroud)