转换sqlite回调函数类型



我正在使用sqlite编写程序。我有类dataSend_task,定期从BD中选择数据并将其发送到服务器。

dataSend_task中,我有方法callback,我想把它作为参数发送给sqlite3_exec

I've got error:

error: cannot convert ‘std::function<int(void*, int, char**, char**)>’ to ‘int (*)(void*, int, char**, char**)’ for argument ‘3’ to ‘int sqlite3_exec(sqlite3*, const char*, int (*)(void*, int, char**, char**), void*, char**)’
         if (sqlite3_exec(this->db, this->SQL_SELECT_READINGS_QUERY, callback, 0, &err)) {

源代码部分:

int dataSend_task::callback(void *NotUsed, int argc, char **argv, char **columnName){...}
void dataSend_task::sendData()
{
    using namespace std::placeholders;
    std::function<int(void *, int, char **, char **)> callback = 
         std::bind(&dataSend_task::callback, this, _1, _2, _3, _4);
    if (sqlite3_exec(this->db, this->SQL_SELECT_READINGS_QUERY, 
                      callback, 0, &err)) 
    { ... }
}

据我所知,问题是将callback转换为sqlite_exec接受的类型。但我不知道怎么补救。

不能将std::function转换为函数指针。但是,您仍然可以使用lambda实现您想要的功能。由于一些魔法,没有捕获的lambda可以转换为函数指针(这正是您所需要的)。还请注意,sqlite3_exec()接受void*作为第一个参数—因此您可以在no-capture lambda中使用它来实际调用成员函数:

if (sqlite3_exec(this->db, this->SQL_SELECT_READINGS_QUERY, 
    +[](void* instance, int x, char** y, char** z) {
        return static_cast<dataSend_task*>(instance)->callback(x, y, z);
    },
    this,
    &err))
{
    /* whatever */
}

最新更新