i'm writing program using sqlite. i've got class datasend_task, periodicaly select data bd , send server.
in datasend_task i've got method callback, want sent argument sqlite3_exec.
i've got error:
error: cannot convert ‘std::function<int(void*, int, char**, char**)>’ ‘int (*)(void*, int, char**, char**)’ argument ‘3’ ‘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)) { source code part:
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)) { ... } } as understand problem in converting callback type sqlite_exec accepts. don't know how fix it.
you cannot convert std::function function pointer. however, can still accomplish want lambda. some sorcery, lambda no capture can converted function pointer (exactly need). notice sqlite3_exec() accepts void* 1st argument - can use in no-capture lambda call member function:
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 */ }
Comments
Post a Comment