我正在用C++包装一些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);
}我应该能够将以下内容传递给最后一个参数
SQLITE_STATIC或SQLITE_TRANSIENT定义这两个定义不出所料地定义为
typedef void (*sqlite_3_destructor_type)(void*);
但我真的不明白void/void的语法。如何将其包装在C++方法中以接受像delete或定义这样的函数?
发布于 2019-01-03 14:59:23
类型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);
}发布于 2019-01-03 15:00:30
这意味着您需要提供一个回调,该调用接受一个参数,一个指向void的指针,而不返回任何内容。这必须是一个自由函数(不是一个类的非静态方法)。
事实上,free就是这样一个函数。您也可以使用类似删除的:
void myfree(void* data)
{
delete static_cast<MyObject*>(data);
}您失去了类型安全性,但是如果这是为了释放作为void*传递给其他地方并也用于回调的对象,则这是定义的行为。
https://stackoverflow.com/questions/54024727
复制相似问题