请教一个Boost signal2 的问题

ayw215 2010-08-09 05:07:02
问题代码如下

#include <iostream>
#include <boost/signals2/signal.hpp>
#include <Windows.h>

struct Hello
{
void operator()() const
{
std::cout << "Hello";
}
};

struct World
{
void operator()() const
{
std::cout << ", World!" << std::endl;
}
};

//[ good_morning_def_code_snippet
struct GoodMorning
{
void operator()() const
{
std::cout << "... and good morning!" << std::endl;
}
};
//]

int main()
{

boost::signals2::signal<void ()> sig;

boost::signals2::connection c1 = sig.connect(1, World()); // connect with group 1
boost::signals2::connection c2 = sig.connect( 0,Hello()); // connect with group 0

sig.connect(GoodMorning());

sig();
sig.disconnect(&Hello::operator());//这里的slot_fun该怎么写?
//sig.disconnect(0); //这样是ok的,但是不能具体指定group里面的某个slot函数
//c2.disconnect();//这样也是ok的
sig();

return 0;
}

我这样写了后:
sig.disconnect(&Hello::operator());//这里的slot_fun该怎么写?
没有任何效果。。。。

虽然下面这两种写法都是满足要求的:
//sig.disconnect(0); //这样是ok的,但是不能具体指定group里面的某个slot函数
//c2.disconnect();//这样也是ok的

但是,我想直接指定disconnect 某个group里面的slot_fun,该怎么写呢?
sig.disconnect(这里面怎么写呢?);
...全文
259 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jim_King_2000 2010-08-09
  • 打赏
  • 举报
回复
disconnect的时候也是可以直接写的。只不过disconnect需要比较传入的functor是否相等。如果使用的是全局函数,那么直接比较函数地址即可。如果使用functor,那没办法,只能自己写operator==。
ayw215 2010-08-09
  • 打赏
  • 举报
回复
你这个。。。囧~~
重写了==
为啥connect的时候可以直接写,disconnect的时候却不行?
Jim_King_2000 2010-08-09
  • 打赏
  • 举报
回复
调试成功。不过是在太麻烦。不推荐使用。

/* 
* File: main.cpp
* Author: jim
*
* Created on 2010年8月9日, 下午5:31
*/

#include <iostream>
#include <boost/signals2/signal.hpp>

struct Hello
{
void operator()() const
{
std::cout << "Hello";
}

template<class T>
bool operator==(const T &val) const
{
return false;
}

bool operator==(const Hello &val) const
{
return true;
}
};

struct World
{
void operator()() const
{
std::cout << ", World!" << std::endl;
}

template<class T>
bool operator==(const T &val) const
{
return false;
}

bool operator==(const World &val) const
{
return true;
}
};

//[ good_morning_def_code_snippet
struct GoodMorning
{
void operator()() const
{
std::cout << "... and good morning!" << std::endl;
}
};
//]

int main()
{

boost::signals2::signal<void ()> sig;

Hello hello;
boost::signals2::connection c1 = sig.connect(1, World()); // connect with group 1
boost::signals2::connection c2 = sig.connect(0, hello); // connect with group 0

sig.connect(GoodMorning());

sig();
sig.disconnect(hello);//这里的slot_fun该怎么写?
//sig.disconnect(0); //这样是ok的,但是不能具体指定group里面的某个slot函数
//c2.disconnect();//这样也是ok的
sig();

return 0;
}


Jim_King_2000 2010-08-09
  • 打赏
  • 举报
回复
Sorry,没看清楚。我找个编译器试试看。
ayw215 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jim_king_2000 的回复:]

C/C++ code
sig.disconnect(&Hello);
[/Quote]
一样失败
这些我都试过了
我想原因在于类的thiscall的原因
需要用boost的bind
但bind我不熟哇。。。不会写。。
Jim_King_2000 2010-08-09
  • 打赏
  • 举报
回复
sig.disconnect(&Hello);
ayw215 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jim_king_2000 的回复:]

试试这个?
C/C++ code
sig.disconnect(Hello);
[/Quote]
编译失败
Jim_King_2000 2010-08-09
  • 打赏
  • 举报
回复
试试这个?
sig.disconnect(Hello);

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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