Функция-указатель на оператор сравнения - PullRequest
0 голосов
/ 28 марта 2012

В настоящее время я пытаюсь понять как перегрузку функций, так и указатели функций. Чтобы сократить кусок кода, я хочу / должен сделать указатель на функцию сравнения. В моем исходном коде я делаю циклы и сравниваю множество пар переменных с плавающей точкой. Мои действия после сравнения зависят от того, является ли третья полустатическая переменная положительной или отрицательной. В этой версии я должен либо проверять значение полустатической переменной для каждой пары, либо мне приходится копировать много кода.

double angleRight; //This variable is either positive or negative and is not reassigned for the purpose of this code

while (points.size() > 2){
siz = points.size();
for (int i = 0; i < siz; i++){
  if (angleRight > 0 && points[i].angle < 0){
<Do something>
    <remove points[i]>
  } else if (angleRight < 0 && points[i].angle > 0){
  <Do something else>
      <remove points[i]>
  }
}

Если бы я вместо этого мог вычислить angleRight один раз, а затем сохранить указатель на функцию для оператора> или оператора <, я мог бы вместо этого использовать указатель на функцию и избежать оценки angleRight, а также всего остального блок. Я пытался понять указатели функций и (думаю) вижу, как мог бы справиться, если бы хотел получить доступ к перегруженной функции-члену. </p>

//This compiles
class Bs{
  public:
  float x;
  bool operator< (Bs y){
    return x < y.x;
  }
};
bool (Bs::*compare) (Bs) /*const*/ = &Bs::operator<;

Но то, что я действительно хочу сделать / представить, выглядит примерно так:

//This does not compile:
bool (*compar) (float) /*const*/ = &float::operator<;

EDIT: Сделав две функции «больше» и «меньше», я получу то, что хочу:

bool greater(float x, float y){
  return x > y;
}
bool less(float x, float y){
  return x < y;
}

bool (*compar) (float, float) = (angleRight < 0)? &greater : &less;

Но меня раздражает, что мне действительно приходится писать функции. Разве нет прямого доступа к float-оператору>?

1 Ответ

1 голос
/ 28 марта 2012

C ++ способ делать такие вещи не принимая указатель на функцию, а принимая функциональный объект .

Пример:

template <class T, class Cmp> int cmp(T x, T y, Cmp cmp_func = std::less) {
    return cmp_func(x, y) - cmp_func(y, x);
}

В этом примере нам абсолютно все равно, что такое Cmp, поскольку оно поддерживает operator() с двумя операндами.

Если ваша функция принимает объект, подобный функции, вы можете использовать стандартные объектыкак std::less, автоматически решая этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...