Передача аргумента в void (*) (void *) - PullRequest
0 голосов
/ 03 января 2019

Я обертываю некоторый код sqlite3 C в C ++ и запутался в аргументах этого типа void(*)(void*) в этой функции

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));

Так что моя обертка выглядит как

int Query::Blob(int index, const void* blob, int blob_size, void* memory_management){
   return sqlite3_bind_blob(stmt, index, blobl, blob_size, memory_management);
}

Я должен быть в состоянии передать следующее до последнего аргумента

  1. Некоторая функция для освобождения памяти BLOB-объектов

  2. Либо SQLITE_STATIC, либо SQLITE_TRANSIENT определяет

Эти два определения неудивительно определены как

typedef void (*sqlite_3_destructor_type)(void*);

Но я действительно не понимаю синтаксис void / void. Как я могу обернуть это в моем методе C ++, чтобы принять функцию, такую ​​как delete или определения?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Это означает, что вам нужно предоставить обратный вызов, который принимает один аргумент, указатель на void и ничего не возвращает. Это должна быть свободная функция (не нестатический метод класса)

Действительно, free такая функция. Вы также можете использовать как удаление:

void myfree(void* data)
{
    delete static_cast<MyObject*>(data);
}

Вы теряете безопасность типов, но если это освобождает объект, переданный как void* где-то еще и также используемый в обратном вызове, это определенное поведение.

0 голосов
/ 03 января 2019

Тип void(*)(void*) является указателем на функцию, не являющуюся членом, которая принимает единственный аргумент типа void * и возвращает void.

Так что если ваша memory_management функция объявлена ​​как:

void memory_management(void *);

Тогда оно соответствует этому определению, и Query::Blob должно быть определено как:

int Query::Blob(int index, const void* blob, int blob_size, void (*memory_management)(void *)){
   return sqlite3_bind_blob(stmt, index, blobl, blob_size, memory_management);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...