【文件属性】:
文件名称:成员函数用于回调函数
文件大小:17KB
文件格式:ZIP
更新时间:2021-08-23 11:52:15
thunk技术
如qsort 等函数需要函数指针才能回调
用此函数库可以将成员函数指针转为普通函数指针
测试代码如下
#include
#include
#include
#include
#include
#include
using cmpfunc = int(__cdecl*)(const void*, const void*);
using DebugArrayFunc = void(__stdcall *)(std::string &out;);
#include "thunk.h"
class MySort
{
public:
int Rule;
MySort(int a):Rule(a){}
// 回调函数
template
int __cdecl sort(const void* a, const void* b);
};
class Test
{
public:
std::vector mm;
void Sort(int (*comp)(const void *,const void *))
{
return qsort(mm._Myfirst,mm.size(),sizeof(int),comp);
}
void Entry(DebugArrayFunc func)
{
std::string string;
cmpfunc comp;
TemplateThunk athunk;
// 正序
comp = (cmpfunc)athunk.GetCall(&MySort;::sort, &MySort;(0));
Sort(comp);
func(string);
std::cout << string << std::endl;
// 逆序
comp = (cmpfunc)athunk.GetCall(&MySort;::sort, &MySort;(1));
Sort(comp);
func(string);
std::cout << string << std::endl;
}
};
class CallBack
{
public:
std::vector *pthis;
CallBack(std::vector *ff):pthis(ff){}
void __stdcall DebugArray(std::string &out;)
{
char buff[100];
char *aa = buff;
for each (auto a in *pthis)
{
aa += sprintf(aa, "%d ", a);
}
out.assign(buff);
}
};
void main()
{
TemplateThunk athunk;
Test tt;
tt.mm = { 1, 3, 7, 8, 5, 6, 4, 2, 3, 10 };
tt.Entry(athunk.GetCall(&CallBack;::DebugArray,&CallBack;(&tt;.mm)));
}
template
int __cdecl MySort::sort(const void* a, const void* b)
{
return Rule ? *static_cast(a)-*static_cast(b) : *static_cast(b)-*static_cast(a);
}
【文件预览】:
Release
----Thunk.dll(8KB)
----Thunk.lib(3KB)
thunk.h
thunklib.vcxproj
thunklib.sln
main.cpp
Debug
----Thunk.dll(31KB)
----Thunk.lib(3KB)