ansi c回调的绑定参数

时间:2015-10-14 06:59:11

标签: c++ tr1

我有函数,让我们说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是一种回复的方法吗?

2 个答案:

答案 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元素。