将参数传递给void(*)(void *)

时间:2019-01-03 14:55:22

标签: c++ sqlite

我正在用C ++包装一些sqlite3 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_STATICSQLITE_TRANSIENT定义

这两个定义毫不奇怪地定义为

typedef void (*sqlite_3_destructor_type)(void*);

但是我真的不理解void / void语法。如何将其包装在C ++方法中以接受诸如delete之类的函数或定义?

2 个答案:

答案 0 :(得分:5)

类型select col1, col2, sum(case when col3 = 'A' and col4 = '+' then col5 end) from mytable group by col1, col2; 是指向非成员函数的指针,该函数接受类型为void(*)(void*)的单个参数并返回void *

因此,如果您的void函数声明为:

memory_management

然后它与该定义匹配,void memory_management(void *); 应该定义为:

Query::Blob

答案 1 :(得分:1)

这意味着您需要提供一个带一个参数,指向void的指针且不返回任何内容的回调。这必须是一个自由函数(不是类的非静态方法)

实际上,free是这样的功能。您也可以使用类似删除的功能:

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

您松开了类型安全性,但是如果这是为了释放在其他地方作为void*传递并也用于回调的对象,则这是定义的行为。