如何在 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);
}
我正在启动一个将使用 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);
}