Как использовать метод класса в cupsEnumDests? - PullRequest
1 голос
/ 03 октября 2019

Я запускаю программу, которая будет использовать CUPS C API, и первый пример вызывает функцию cupsEnumDests:

#include <stdio.h>
#include <cups/cups.h>

int print_dest(void *user_data, unsigned flags, cups_dest_t *dest)
{
  if (dest->instance)
    printf("%s/%s\n", dest->name, dest->instance);
  else
    puts(dest->name);

  return (1);
}

int main(void)
{
  cupsEnumDests(CUPS_DEST_FLAGS_NONE, 1000, NULL, 0, 0, print_dest, NULL);

  return (0);
}

Но эта функция принимает функцию C в качестве параметра, в то время какЯ использую C ++ и хочу предоставить ему метод класса.

Я пробовал cupsEnumDests(CUPS_DEST_FLAGS_NONE, 1000, NULL, 0, 0, this->MyMethod, NULL);, но выдает ошибку

: недопустимое использование нестатической функции-члена 'int MyClass :: MyMethod (void *, unsigned int, cups_dest_t *) '

update Я обнаружил, что это работает, когда я создаю метод static, но я бынравится использовать this->MyMethod.

1 Ответ

1 голос
/ 03 октября 2019

Нет способа преобразовать нестатическую функцию-член класса в обычный указатель на функцию. Обычный способ решить эту проблему, и ваш API это позволяет, - передать указатель на функцию, который принимает void*, а затем передать дополнительные данные как void* в функцию API, а затем ваша функция преобразует это * 1003. * к типу класса и вызывает его функцию-член.

Это сделало бы ваш код похожим на

struct Foo
{
    void some_function() { /* do stuff */ }
};

int wrapper_func(void* instance, unsigned flags, cups_dest_t *dest)
{
    static_cast<Foo*>(instance)->some_function();
    return 42;
}

int main(void)
{
    Foo f;
    cupsEnumDests(CUPS_DEST_FLAGS_NONE, 1000, NULL, 0, 0, wrapper_func, &f);
}
...