我有函数,让我们说foo,在lib中接受回调:
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);
}
但我不能让对象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是一种回复的方法吗?
答案 0 :(得分:1)
您必须使用具有该签名的全局函数。由于您获得了函数指针类型typedef void (*CallbackType)(unsigned int)
,因此您的回调需要返回void
并获取一个unsigned int
参数:
void function(unsigned int);
CallbackType funcPtr = &function;
如果回调没有提供“用户数据”参数(通常是void*
)来传递附加数据,你要么必须以某种方式使它们适合现有的参数(也许可以使用一些整数),或使用全局变量,除非绝对必要,否则我不推荐。
答案 1 :(得分:0)
如果ProgressBarClass
类型的任何对象都没问题,只需删除static
关键字。
如果你需要一些ProgressBarClass
类型的特定对象,那么不,没有办法通过你的C回调传递一个。你必须有某种的静态变量,它允许你获取对象。它不一定是ProgressBarClass
。也许你应该有一个代表你的应用程序的单例,其方法可以返回各种GUI元素。