将参数传递给 void(*)(void*)
Passing an argument to a void(*)(void*)
我正在用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
或定义这样的函数?
类型
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);
}
这意味着
你需要提供一个回调,该回调接受一个参数,一个指向void
的指针,并且不返回任何内容。这必须是一个自由函数(而不是类的非静态方法)
事实上,free
就是这样的功能。您也可以使用类似删除的内容:
void myfree(void* data)
{
delete static_cast<MyObject*>(data);
}
你失去了类型安全,但如果这是为了释放作为void*
传递到其他地方并在回调中使用的对象,这是定义的行为。
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在派生函数中指定void*参数
- 使用指向成员的指针将成员函数作为参数传递
- 如何将参数传递给正在使用模板的类
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 将带有参数的void方法传递给使用std ::函数和std :: bind c 的另一种方法
- 将 std::function 作为参数传递,const void *
- 将"void"作为函数参数传递
- 将指向成员函数的指针作为void*函数的参数传递
- 通过 const 引用将参数传递给非 void 函数:它是否被视为副作用
- 'Invalid use of void expression'传递函数参数
- 错误:将“const Cell”作为“void Cell::p rintcell()”的“this”参数传递丢弃限定符[
- 将void函数作为参数传递给另一个函数
- c++将函数作为参数传递给另一个带void指针的函数
- 错误:将'const Tarih'作为'void(int)' 'this'参数传递丢弃限定符|
- 在需要void*参数的函数中传递unique_ptr最安全的方法是什么?
- 将可变参数函数模板的每个参数传递给返回void的函数
- 如何在类/函数模板中传递void参数
- 向void函数传递参数