如何在 cupsEnumDests 中使用 class 方法?

How to use a class method in cupsEnumDests?

我正在启动一个将使用 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++,我想为它提供一个class方法。

我尝试了 cupsEnumDests(CUPS_DEST_FLAGS_NONE, 1000, NULL, 0, 0, this->MyMethod, NULL); 但它给出了错误

error: invalid use of non-static member function ‘int MyClass::MyMethod(void*, unsigned int, cups_dest_t*)’

update 我发现当我制作方法 static 时它确实有效,但我想使用 this->MyMethod.

无法将非静态 class 成员函数转换为常规函数指针。解决这个问题的一种常见方法,并且您的 API 允许它,是传递一个带有 void* 的函数指针,然后将可选数据作为 void* 传递给 API 函数,然后你的函数将 void* 转换为 class 类型并调用它的成员函数。

这会让你的代码看起来像

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);
}