欢迎光临散文网 会员登陆 & 注册

(已解决)模板类的函数指针与普通函数指针转化的问题

2021-05-28 13:46 作者:晓舟_ZhouSensor  | 我要投稿

问题

想在c++写一个template class, 目的是可以让任意结构体直接对应数据库的数据,方便同步和操作数据库。


目前遇到的问题是,sqlite的读取数据api,是使用的callback。
因为callback必须是一个全局函数,不能将类(模板类)中的函数给到callback。

但因为被callback的功能中,必须将数据放入对应的模板结构体中,所以必须要从模板处获取结构体类型,导致这个被callback的函数必须在类模板中……

初步的想法

既然callback只能传递全局函数,就用static在class里声明一个静态函数指针,在准备callback之前,更新指针到该类的实现函数上,从而进行callback。

又遇到问题

方法1:声明静态函数指针,在调用callback前将当前类的函数指针更新到静态指针上

静态指针
更新静态指针

在更新静态指针这里报错了,无法将类函数指针转化为静态指针,不知如何解决。


方法2:用std::function和std::bind实现相同功能

用function定义了一个函数指针
用bind更新函数指针

这次函数指针更新是成功了,但引起另一个报错的是sqlite3_exec的callback,无法将function转化为普通的函数指针……


emmmmmmm

还不知道怎么解决

已解决20210528

非常感谢 kotono 和 Phynon 的回复,并且kotono给出了正确的解决方案,太神啦!

Phynon

成员函数不允许赋值给普通函数指针吧

kotono

这个是没有办法转化的

pointer to member function和pointer to function基本是两个东西,而std::function也无法转化成函数指针
这种情况一般的处理方式是让一个非成员函数统一处理回调,用收到的参数再去调对应的对象
C的回调一般会有一个void*的参数用来干这个事情的

确实是有,但又存在问题……
因为模板类是不知道模板参数是什么,所以回调函数收到类指针,也不知道要转化成什么模板类

kotono

这个不是问题吧,应该直接转成T就行

不用全局函数,而是用你 data<T> 的一个static函数就行

尝试了一下果然成功了!!
暴力转化为THIS

原来模板内的静态函数是可以直接获取到T的内容的,所以直接在模板内强制转换指针就可以实现对当前类成员的访问了!


(已解决)模板类的函数指针与普通函数指针转化的问题的评论 (共 条)

分享到微博请遵守国家法律