在C+中实现事件+; 在Internet上对C++事件高效实现的一些研究之后,我发现以下方法 接口类-应用程序可以重写派生类中的虚拟函数 使用函数指针的正常回调机制 使用Boost.function的学员 信号和插槽(在Qt中使用)

在C+中实现事件+; 在Internet上对C++事件高效实现的一些研究之后,我发现以下方法 接口类-应用程序可以重写派生类中的虚拟函数 使用函数指针的正常回调机制 使用Boost.function的学员 信号和插槽(在Qt中使用),c++,events,C++,Events,我对每种方法的优缺点以及何时使用这些方法感到困惑。 哪种方法最好?为什么? 是否有其他的解决方案比列出的更好? < P>前两个选项是基本C++标准的一部分,其中回调函数与C代码兼容。 另外两个选项分别需要使用boost和Qt 优势/劣势是一个过于宽泛的问题,答案在很大程度上取决于你在做什么,在什么环境下,为了什么目的。FWIW,我的投票是针对任何一天的 Boost确保了可移植性。当然,它与Boost Asio、Functional、Bind等完美集成 更新: 信号2 本文档描述了原始Boost.

我对每种方法的优缺点以及何时使用这些方法感到困惑。 哪种方法最好?为什么?
是否有其他的解决方案比列出的更好?

< P>前两个选项是基本C++标准的一部分,其中回调函数与C代码兼容。 另外两个选项分别需要使用boost和Qt


优势/劣势是一个过于宽泛的问题,答案在很大程度上取决于你在做什么,在什么环境下,为了什么目的。

FWIW,我的投票是针对任何一天的

Boost确保了可移植性。当然,它与Boost Asio、Functional、Bind等完美集成

更新:

信号2 本文档描述了原始Boost.Signals库的线程安全变体。为了支持线程安全,对接口进行了一些更改,主要涉及自动连接管理。[……]

Boost确保了可移植性。当然,它与Boost Asio、Functional、Bind等完美集成

boost::signals2::sig信号

sig.connect(&print_sum);
sig.connect(&print_product);
sig.connect(&print_difference);
sig.connect(&print_quotient);

sig(5., 3.);
此程序将打印以下内容:

The sum is 8
The product is 15
The difference is 2
The quotient is 1.66667

示例操作:

void print_sum(浮点x,浮点y)
{
std::cout你检查过了吗?它有你可能需要的所有设施(可能更多),甚至驱动设计。你可以构建(真实的)定时和非定时模型,它是纯C++,不受宏的污染。它还利用C++ 0x来提高性能。如果你使用C++ 0x编译器,你可以得到lambda函数作为事件处理程序——它非常强大。GBL支持同步和异步事件处理程序、线程和光纤。和端口。通过一些巧妙和仔细的设计,您可以使用异步事件处理程序,显著提高多核/多处理器系统的性能。它还具有图形设计器和跟踪器


如果没有可视化,构建和维护事件驱动的应用程序可能会非常困难,designer会提供很多帮助。调试事件驱动的应用程序也可能非常困难,因为您不再有顺序执行,而是执行从一个事件处理程序跳到另一个事件处理程序,因此使用事件跟踪器有助于签名可以使用观测器设计模式。这里是一个C++源代码。

更具体地描述“事件”。我正在尝试构建某种SDK库。该库可以向应用程序发送事件。我知道拥有抽象类方法或回调是一对一的事件机制。但是委托或信号可以启用一对多事件。使用委托或信号时还有其他adv吗?为什么是Boost.signals而不是?@ildjam:没有线索:)updateinganswer@sehe:你看过吗?它特别有趣…@ildjam:不,我很感激这个提示。我会在这个周末的某个时候看看:)没有boost库,因为我在嵌入式平台上运行这个程序。替代方案是什么?
void print_sum(float x, float y)
{
  std::cout << "The sum is " << x+y << std::endl;
}

void print_product(float x, float y)
{
  std::cout << "The product is " << x*y << std::endl;
}

void print_difference(float x, float y)
{
  std::cout << "The difference is " << x-y << std::endl;
}

void print_quotient(float x, float y)
{
  std::cout << "The quotient is " << x/y << std::endl;
}