boost::function 问题,请求大神帮忙

YouNeverCanTell 2013-12-12 10:42:37
    
typedef int(*PTR)(Callback_MsgInfo*);
boost::function<int(Callback_MsgInfo*)> f = boost::bind(&AAA::callback, this , _1);
PTR* pCallback1 = f.target<PTR>();


&AAA::callback 这个函数无论是成员函数 , 还是虚函数。pCallback1返回值都是空。

我很无语了。请求大神帮忙
...全文
143 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 YouNeverCanTell 的回复:
[quote=引用 1 楼 akirya 的回复:] 你的目的是啥?
获取 对象AAAA 的callback 函数地址。[/quote] 首先,没有合法的手段获取成员函数的地址。 其次f.target也应该是个bind返回的对象类型,而不是一个函数指针类型。
YouNeverCanTell 2013-12-13
  • 打赏
  • 举报
回复
引用 2 楼 qq120848369 的回复:
说实话看不懂楼主这句代码:PTR* pCallback1 = f.target<PTR>();
可以看看boost function . 作用是:获取 对象AAAA 的callback 函数地址。
YouNeverCanTell 2013-12-13
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
你的目的是啥?
获取 对象AAAA 的callback 函数地址。
  • 打赏
  • 举报
回复
引用 11 楼 YouNeverCanTell 的回复:
[quote=引用 10 楼 akirya 的回复:] [quote=引用 6 楼 YouNeverCanTell 的回复:] [quote=引用 5 楼 akirya 的回复:] [quote=引用 3 楼 YouNeverCanTell 的回复:] [quote=引用 1 楼 akirya 的回复:] 你的目的是啥?
获取 对象AAAA 的callback 函数地址。[/quote] 首先,没有合法的手段获取成员函数的地址。 其次f.target也应该是个bind返回的对象类型,而不是一个函数指针类型。[/quote] boost::function<int(Callback_MsgInfo*)> f = boost::bind(&AAA::callback, this , _1); PTR* pCallback1 = f.target<PTR>();[/quote] boost::bind(&AAA::callback, this , _1);的返回类型是
boost::_bi::bind_t<int,boost::_mfi::mf1<int,AAA,Callback_MsgInfo *>,boost::_bi::list2<boost::_bi::value<AAA *>,boost::arg<1> > >
而不是 boost::function<int(Callback_MsgInfo*)>[/quote] 类型不对,编译能通过吗?[/quote] 当然可以了 boost::function 的功能就是如此,不管是啥类型的类对象只要有 int operator()((Callback_MsgInfo* ); 这个成员,就可以赋值给 boost::function<int(Callback_MsgInfo*)>
struct Callback_MsgInfo{};

class AAA
{
public:

	int callback(Callback_MsgInfo*){ return 0;}
	void func()
	{
		typedef int(*PTR)(Callback_MsgInfo*);

		boost::function<int(Callback_MsgInfo*)> f = boost::bind(&AAA::callback, this , _1);
		typedef boost::_bi::bind_t<int,boost::_mfi::mf1<int,AAA,Callback_MsgInfo *>,boost::_bi::list2<boost::_bi::value<AAA *>,boost::arg<1> > > FuncType;
		FuncType* v = f.target<FuncType>();
	}
};


int main()
{
	AAA a;
	a.func();
	return 0;
}
YouNeverCanTell 2013-12-13
  • 打赏
  • 举报
回复
下班了, 周一聊! 我自己也看会。 谢谢大神。 不过我觉得 boost::function<int(Callback_MsgInfo*)> f = boost::bind(&AAA::callback, this , _1); PTR* pCallback1 = f.target<PTR>(); 没有问题。 或许 以讹传讹!!!!
YouNeverCanTell 2013-12-13
  • 打赏
  • 举报
回复
引用 10 楼 akirya 的回复:
[quote=引用 6 楼 YouNeverCanTell 的回复:] [quote=引用 5 楼 akirya 的回复:] [quote=引用 3 楼 YouNeverCanTell 的回复:] [quote=引用 1 楼 akirya 的回复:] 你的目的是啥?
获取 对象AAAA 的callback 函数地址。[/quote] 首先,没有合法的手段获取成员函数的地址。 其次f.target也应该是个bind返回的对象类型,而不是一个函数指针类型。[/quote] boost::function<int(Callback_MsgInfo*)> f = boost::bind(&AAA::callback, this , _1); PTR* pCallback1 = f.target<PTR>();[/quote] boost::bind(&AAA::callback, this , _1);的返回类型是
boost::_bi::bind_t<int,boost::_mfi::mf1<int,AAA,Callback_MsgInfo *>,boost::_bi::list2<boost::_bi::value<AAA *>,boost::arg<1> > >
而不是 boost::function<int(Callback_MsgInfo*)>[/quote] 类型不对,编译能通过吗?
  • 打赏
  • 举报
回复
引用 6 楼 YouNeverCanTell 的回复:
[quote=引用 5 楼 akirya 的回复:] [quote=引用 3 楼 YouNeverCanTell 的回复:] [quote=引用 1 楼 akirya 的回复:] 你的目的是啥?
获取 对象AAAA 的callback 函数地址。[/quote] 首先,没有合法的手段获取成员函数的地址。 其次f.target也应该是个bind返回的对象类型,而不是一个函数指针类型。[/quote] boost::function<int(Callback_MsgInfo*)> f = boost::bind(&AAA::callback, this , _1); PTR* pCallback1 = f.target<PTR>();[/quote] boost::bind(&AAA::callback, this , _1);的返回类型是
boost::_bi::bind_t<int,boost::_mfi::mf1<int,AAA,Callback_MsgInfo *>,boost::_bi::list2<boost::_bi::value<AAA *>,boost::arg<1> > >
而不是 boost::function<int(Callback_MsgInfo*)>
YouNeverCanTell 2013-12-13
  • 打赏
  • 举报
回复
引用 8 楼 derekrose 的回复:
看了半天 没看明白啥意思
我是在19世纪吗?
derekrose 2013-12-13
  • 打赏
  • 举报
回复
看了半天 没看明白啥意思
YouNeverCanTell 2013-12-13
  • 打赏
  • 举报
回复
引用 5 楼 akirya 的回复:
[quote=引用 3 楼 YouNeverCanTell 的回复:] [quote=引用 1 楼 akirya 的回复:] 你的目的是啥?
获取 对象AAAA 的callback 函数地址。[/quote] 首先,没有合法的手段获取成员函数的地址。 其次f.target也应该是个bind返回的对象类型,而不是一个函数指针类型。[/quote] boost 内部实现,直接查找虚函数表,然后遍历虚函数表,比较类型信息RTTI , 返回对应的指针。
YouNeverCanTell 2013-12-13
  • 打赏
  • 举报
回复
引用 5 楼 akirya 的回复:
[quote=引用 3 楼 YouNeverCanTell 的回复:] [quote=引用 1 楼 akirya 的回复:] 你的目的是啥?
获取 对象AAAA 的callback 函数地址。[/quote] 首先,没有合法的手段获取成员函数的地址。 其次f.target也应该是个bind返回的对象类型,而不是一个函数指针类型。[/quote] boost::function<int(Callback_MsgInfo*)> f = boost::bind(&AAA::callback, this , _1); PTR* pCallback1 = f.target<PTR>();
qq120848369 2013-12-12
  • 打赏
  • 举报
回复
说实话看不懂楼主这句代码:PTR* pCallback1 = f.target<PTR>();
  • 打赏
  • 举报
回复
你的目的是啥?

64,682

社区成员

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

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