Finesse
@Finesse

Как передать метод класса в качестве колбэка?

Пытаюсь передать метод класса в качестве параметра функции для того, чтобы посчитать количество его вызовов:
class Foo {
  public:
    int operationsAmount = 0;
    int values[] = {0, 4, -1, 6, -12, 32};

    int compare(const void *a, const void *b) {
      ++operationsAmount;
      return (*(int*)a - *(int*)b);
    }

    Foo() {
      qsort(values, 6, sizeof(int), compare);
    }
};

int main() {
  Foo foo = new Foo();
}


При попытке скомпилировать это компилятор ругается:
no known conversion for argument 1 from '<unresolved overloaded function type>' to 'int (*)(const void *, const void *)'


Возможно ли в C++ передавать метод класса в качестве аргумента функции? Как правильно сделать то, что я пытаюсь сделать? (пример сферический в вакууме, поэтому счётчик должен оставаться атрибутом класса)

Всё это нужно для того, чтобы у колбека, передаваемого в качестве аргумента функции независимой библиотеке, оставался доступ к атрибутам объекта.
  • Вопрос задан
  • 1588 просмотров
Пригласить эксперта
Ответы на вопрос 3
AxisPod
@AxisPod
Либо сделать статическим и убрать подсчёт операций, либо выносить переменную в глобальное пространство, либо никак. Если функция не имеет возможности получить метод объекта. Метод объекта прокидывается 2мя аргументами без варинтов, это адрес метода и адрес объекта.

Есть еще вариант с использованием функтора или лямбды (по сути сахар для функтора).

А на деле чем к примеру не устраивает std::sort? Он умеет принимать различные функциональные объекты, в том числе и функторы, а вот qsort никак не может принять объект.
Ответ написан
@Xano
как вариант - std::bind
Ответ написан
maaGames
@maaGames
Погроммирую программы
Что за извращения с qsort??? Забудь об этой функции, в С++ ей не место. Используй std::sort, в неё можно передать функтор.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы