首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >绑定参数到ansi c回调

绑定参数到ansi c回调
EN

Stack Overflow用户
提问于 2015-10-14 14:59:11
回答 2查看 231关注 0票数 0

我在lib中有一个函数,比如说foo,它接受回调:

代码语言:javascript
运行
复制
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是静态的,所以我想我应该绑定对它的引用:

代码语言:javascript
运行
复制
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回调吗?

EN

回答 2

Stack Overflow用户

发布于 2015-10-14 15:08:20

您必须求助于具有该签名的全局函数。由于函数指针类型为typedef void (*CallbackType)(unsigned int),因此回调需要返回void并接受一个unsigned int参数:

代码语言:javascript
运行
复制
void function(unsigned int);
CallbackType funcPtr = &function;

如果回调没有提供“用户数据”参数(通常是void*)来传递额外的数据,您要么必须以某种方式使它们适合现有的参数(也许可以使用整数的一些位),要么使用全局变量,除非绝对必要,否则我不建议使用全局变量。

票数 1
EN

Stack Overflow用户

发布于 2015-10-14 15:21:52

如果任何ProgressBarClass类型的对象都是OK的,只需删除static关键字。

如果你需要一些特定的ProgressBarClass类型的对象,那么没有办法通过你拥有的C回调传递一个。你必须有某种静态变量来允许你获取对象。它不一定是ProgressBarClass。也许您应该使用一个单例来表示您的应用程序,并使用返回其各种GUI元素的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33118623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档