我正在用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);
}
我应该能够将以下内容传递给最后一个参数
一些释放Blob内存的功能
SQLITE_STATIC
或SQLITE_TRANSIENT
定义
这两个定义毫不奇怪地定义为
typedef void (*sqlite_3_destructor_type)(void*);
但是我真的不理解void / void语法。如何将其包装在C ++方法中以接受诸如delete
之类的函数或定义?
答案 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*
传递并也用于回调的对象,则这是定义的行为。