boost高手请进

ysjyniiq 2011-03-08 11:47:18
void Testttt(void * ,int )
{
}
typedef void (*fnType)(void * ,int);

boost::function<void (void * ,int)> fn;
fn=Testttt;//能过
myFn=Testttt;//能过
//myFn=&fn;//编译不过
//myFn=fn;//编译不过
都知道boost::function是仿函数
有没有办法取出boost::function的函数指针,因为我需求真实的函数指针来做回调。
若能解决追加100分
...全文
196 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fw_csd 2011-03-10
  • 打赏
  • 举报
回复
现代c++的回调接口一般是一个模板参数,才可以和boost::function 等混用,若何c的搭配,一般可以写一个模板通用的包装
王旺旺旺 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ysjyniiq 的回复:]

引用 5 楼 aheroofeast 的回复:
引用 3 楼 ysjyniiq 的回复:

引用 1 楼 aheroofeast 的回复:
function<>是个函数对象, 本来就是为了解决C语言中的函数指针的弊端而出现的.
你有何必从中再取出函数指针呢?

还是直接用函数对象吧.

其它人某些类,需要传个函数指针进去,我有一个函数其参数与那个函数指针类型相似,是相似!!!如……
[/Quote]

这个, 我有点怀疑typedef void (*fnType)(void * ,int);中的参数 void* 是指你的class的this指针, 若是这样的话, 你需要就是一个static函数, 在static函数中再用this调用具体的私有函数xxx.
ysjyniiq 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 aheroofeast 的回复:]
引用 3 楼 ysjyniiq 的回复:

引用 1 楼 aheroofeast 的回复:
function<>是个函数对象, 本来就是为了解决C语言中的函数指针的弊端而出现的.
你有何必从中再取出函数指针呢?

还是直接用函数对象吧.

其它人某些类,需要传个函数指针进去,我有一个函数其参数与那个函数指针类型相似,是相似!!!如果boost.function管用,我直接就bind……
[/Quote]
假如他要的函数原型是
typedef void (*fnType)(void * ,int);

class COtherClass
{
public:
void SetCallBack(fnType fn);
};

而我的函数是在类里面
class CMyClass
{
public:
void xxxx(int a,void *b ,char c,double d,float e);
};

如果可以的话我就可以写代码:
COtherClass otherobj;
CMyClass myObj;
boost::function<void (void * ,int)> fn=bind(&myObj::xxxx,&myObj,_1,_2,_3,_4,_5);
otherobj.SetCallBack(fn);
pengzhixi 2011-03-08
  • 打赏
  • 举报
回复
额,那这个只重载了operator()
王旺旺旺 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ysjyniiq 的回复:]

引用 1 楼 aheroofeast 的回复:
function<>是个函数对象, 本来就是为了解决C语言中的函数指针的弊端而出现的.
你有何必从中再取出函数指针呢?

还是直接用函数对象吧.

其它人某些类,需要传个函数指针进去,我有一个函数其参数与那个函数指针类型相似,是相似!!!如果boost.function管用,我直接就bind一下就可以传进去了,不需要重要再写个函数,包装……
[/Quote]
你把相关代码贴一下吧, 比如他要的函数指针的原型, 你这边代码的样式等.
pathuang68 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aheroofeast 的回复:]

function<>是个函数对象, 本来就是为了解决C语言中的函数指针的弊端而出现的.
你有何必从中再取出函数指针呢?

还是直接用函数对象吧.
[/Quote]

支持
ysjyniiq 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aheroofeast 的回复:]
function<>是个函数对象, 本来就是为了解决C语言中的函数指针的弊端而出现的.
你有何必从中再取出函数指针呢?

还是直接用函数对象吧.
[/Quote]
其它人某些类,需要传个函数指针进去,我有一个函数其参数与那个函数指针类型相似,是相似!!!如果boost.function管用,我直接就bind一下就可以传进去了,不需要重要再写个函数,包装下
lwanttowin 2011-03-08
  • 打赏
  • 举报
回复
本质问题不是调用方式问题,而是你代码设计问题。
王旺旺旺 2011-03-08
  • 打赏
  • 举报
回复
function<>是个函数对象, 本来就是为了解决C语言中的函数指针的弊端而出现的.
你有何必从中再取出函数指针呢?

还是直接用函数对象吧.
王旺旺旺 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ysjyniiq 的回复:]

引用 10 楼 cunsh 的回复:
你要把仿函数转回去变成函数指针吧. 这种需求不对.
otherobj.SetCallBack(fn); // 假设这里把 fn 转为函数指针传进去了.
注册之后. fn 可能被析构掉了. 它保存的那些绑定上去的参数也失踪了. 只留下一个不知道指向什么东西的函数指针有什么用呢?

说得很有道理!!
[/Quote]
fn是个指针, 不存在析构的问题, 只要你在otherobj中存了这个指针就没啥问题。
不过你现在的需求,是要把成员函数当作普通的回调函数来使用,目前好像没有
什么办法,要么就用static成员函数吧。要么就改接口吧,让接口可以接受函数对象。
ysjyniiq 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cunsh 的回复:]
你要把仿函数转回去变成函数指针吧. 这种需求不对.
otherobj.SetCallBack(fn); // 假设这里把 fn 转为函数指针传进去了.
注册之后. fn 可能被析构掉了. 它保存的那些绑定上去的参数也失踪了. 只留下一个不知道指向什么东西的函数指针有什么用呢?
[/Quote]
如果有类似这样的需求有什么高级解决方法呢?
ysjyniiq 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cunsh 的回复:]
你要把仿函数转回去变成函数指针吧. 这种需求不对.
otherobj.SetCallBack(fn); // 假设这里把 fn 转为函数指针传进去了.
注册之后. fn 可能被析构掉了. 它保存的那些绑定上去的参数也失踪了. 只留下一个不知道指向什么东西的函数指针有什么用呢?
[/Quote]
说得很有道理!!
cunsh 2011-03-08
  • 打赏
  • 举报
回复
你要把仿函数转回去变成函数指针吧. 这种需求不对.
otherobj.SetCallBack(fn); // 假设这里把 fn 转为函数指针传进去了.
注册之后. fn 可能被析构掉了. 它保存的那些绑定上去的参数也失踪了. 只留下一个不知道指向什么东西的函数指针有什么用呢?
ysjyniiq 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 aheroofeast 的回复:]
引用 7 楼 ysjyniiq 的回复:

引用 5 楼 aheroofeast 的回复:
引用 3 楼 ysjyniiq 的回复:

引用 1 楼 aheroofeast 的回复:
function<>是个函数对象, 本来就是为了解决C语言中的函数指针的弊端而出现的.
你有何必从中再取出函数指针呢?

还是直接用函数对象吧.

其它人某些类,需要传个函数指针进去,我有一个函……
[/Quote]

不是class指针,它是一个普通类型我只是用来作举例。
static?你不就是叫我再写多写个函数而已嘛,我发这个贴子的目的就是我不想写任何函数,我不喜欢这种丑陋的做法,做层层包装,这种退让我办法,我都知道。
假设CMyclass和COtherClass都是别人的类呢,现在仅仅是需要一个adapter,把两个对象连起来,用优雅的手法连起来!

64,671

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧