Вы не можете сделать это, потому что указатель C ++ на нестатическую функцию-член не совместим с типом указателя на функцию, не являющуюся членом.Это связано с тем, что функциям-членам требуется дополнительный аргумент - объект, для которого должна быть вызвана функция-член, которая становится this
указателем внутри вызова.
Если вы сделаете ваши функции-члены статичными, ваш код скомпилируется,Однако это не обязательно будет делать то, что вы хотите достичь, потому что one
и two
не имеют доступа к другим нестатическим элементам A
.
Хитрость в передаче функций-членов в функции Cтребует передачи дополнительного указателя void*
с «регистрационной» записью и передачи кода C обратно в статические функции обратного вызова:
struct Cstruct
{
void *context; // Add this field
int (*fn1)(void*, int);
int (*fn2)(void*, int);
};
class A
{
public:
static int oneWrap(void* ptr, int x)
{
return static_cast<A*>(ptr)->one(x);
}
static int twoWrap(void* ptr, int x)
{
return static_cast<A*>(ptr)->two(x);
}
int one(int x)
{
}
int two(int x)
{
}
int three(int x)
{
struct Cstruct cstr = {this, &this->oneWrap, &this->twoWrap};
}
};
Код C должен будет передать значение context
вfn1
и fn2
:
cs.fn1(cs.context, 123);
cs.fn2(cs.context, 456);