我在lib中有一个函数,比如说foo,它接受回调:
typedef void (*CallbackType)(unsigned int);
void foo(const tchar* path, CallBackType); // library function
static void boo(unsigned int percent)
{
static ProgressBarClass progressBar;
progressBar.setProgressValue(percent);
}但是我不能让object progressBar是静态的,所以我想我应该绑定对它的引用:
static void boo(unsigned int percent, ProgressBarClass& progressBar)
{
progressBar.setProgressValue(percent);
}
void something() {
ProgressBarClass progressBar;
tr1::function<static void(unsigned int)> f = tr1::bind(boo, tr1::placeholders::_1, tr1::ref(progressBar));
foo(someWCHARPath, f);
}但我当然不能将tr1::function转换成ansi c回调,所以问题是有没有什么好的,干净的,我能做什么?我可以通过某种方式绑定progressBar到ansi c回调吗?
发布于 2015-10-14 15:08:20
您必须求助于具有该签名的全局函数。由于函数指针类型为typedef void (*CallbackType)(unsigned int),因此回调需要返回void并接受一个unsigned int参数:
void function(unsigned int);
CallbackType funcPtr = &function;如果回调没有提供“用户数据”参数(通常是void*)来传递额外的数据,您要么必须以某种方式使它们适合现有的参数(也许可以使用整数的一些位),要么使用全局变量,除非绝对必要,否则我不建议使用全局变量。
发布于 2015-10-14 15:21:52
如果任何ProgressBarClass类型的对象都是OK的,只需删除static关键字。
如果你需要一些特定的ProgressBarClass类型的对象,那么没有办法通过你拥有的C回调传递一个。你必须有某种静态变量来允许你获取对象。它不一定是ProgressBarClass。也许您应该使用一个单例来表示您的应用程序,并使用返回其各种GUI元素的方法。
https://stackoverflow.com/questions/33118623
复制相似问题