параметр функции, указывающий на другую функцию - PullRequest
2 голосов
/ 12 марта 2012

Это более конкретный вопрос, основанный на вопросе, который я задал ранее ...

Если у меня есть функция, которая принимает два параметра (один обязательный, другой необязательный):

  1. контейнер STL, такой как вектор
  2. «опциональная» функция сравнения, которая служит реляционной перегрузкой и возвращает максимальное значение, независимо от того, что есть, в векторе ...

Код:

template <typename Type>
Type FindMax (std::vector<Type> &myVec, int (*cmp)(Type one, Type two) = CallBack)
/.../

ЧТО именно, "int (* cmp) (Type one ...)" говорит компилятору? Я хочу сказать, что здесь есть функция, используемая при сравнении двух типов Type ... т.е. при использовании реляционных операторов <,>, = и т. Д. Если пользователь не предоставляет никакой функции, тогда используйте значение по умолчанию, в противном случае используйте что предоставляет пользователь ...

Что именно говорит (* cmp) (Тип один, Тип два)? Вот указатель на функцию, которая принимает два параметра Тип один и Тип два? Есть ли какое-либо значение в отношении того, что следует после *, то есть я мог написать (* titsmagee) (Тип один, Тип два)? Я предполагаю, что соглашение об именах должно помочь будущим читателям?

Для того, чтобы это работало со "структурой", нужно ли что-то определенное для потенциальных сравнений быть сохраненным в указанной структуре?

Спасибо!

1 Ответ

5 голосов
/ 12 марта 2012
int (*cmp)(Type one, Type two)

Параметр с именем cmp является указателем на функцию, возвращающую int, которая принимает два параметра типа Type.

struct Foo
{
   int x;
};
int compare(Foo x, Foo y)
{
   return (x.x == y.x) ? 0 : (x.x > y.x ? 1 : -1);
}

std::vector<Foo> vec;

FindMax<Foo>(vec, &compare);

Вам нужно cmp, чтобы вы могли вызватьфункция сравнения внутри FindMax:

template <typename Type>
Type FindMax (std::vector<Type> &myVec, int (*cmp)(Type one, Type two) = CallBack)
{
    //whatever loop
    max = cmp(myVec[i],myVec[j]) >= 0 ? myVec[i] : myVec[j];
}

EDIT Прерывание возврата:

return (x.x == y.x) ? 0 : (x.x > y.x ? 1 : -1);

?: является троичным условным оператором.

condition ? expression1 : expression2

возвращает (свободно говоря) выражение1, если condition верно, выражение2 в противном случае.

Так что это означает:

if (x.x == y.x) 
   return 0; 
else 
   if (x.x > y.x) 
       return 1; 
   else 
       return -1;

Это то, что вы ожидаете от функции сравнения.Вернуть 0 для равенства, 1, если первый элемент больше второго, и -1 для обратного.

РЕДАКТИРОВАТЬ 2

struct Foo
{
   int x;
};
//Foo has a member x.
Foo f;
//Create a Foo object called f.
f.x;
//Access the member x of the object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...