用C++实现事件

Implementing events in C++

本文关键字:事件 实现 C++      更新时间:2023-10-16

在互联网上研究了一种在C++中实现事件的有效方法后,我发现了以下方法

  • 接口类-应用程序可以覆盖派生类中的虚拟函数
  • 使用函数指针的普通回调机制
  • 使用Boost.函数的学员
  • 信号和插槽(如Qt中所用)

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

FWIW,我随时都会投票支持Boost Signals。

Boost可确保便携性。当然,它与Boost Asio、Functional、Bind等很好地集成在一起。

更新:

信号2

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

Boost可确保便携性。当然,它与Boost Asio、Functional、Bind等很好地集成在一起。

boost::signals2::signalsig;

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(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;
}

您检查GBL库了吗?它拥有您可能需要(甚至可能更多)的所有设施,用于驱动设计。你可以用它构建(真实的)定时和非定时模型。它是纯C++,没有被宏污染。它还利用C++0x来提高性能。此外,如果您使用C++0x编译器,您可以获得充当事件处理程序的lambda函数——它非常强大。GBL支持同步和异步事件处理程序、线程和光纤。它通过信号和端口抽象事件流。通过一些独创性和精心设计,您可以使用异步事件处理程序,并显著提高多核/多处理器系统的性能。它还有一个图形设计器和跟踪器。

如果没有可视化,构建和维护事件驱动的应用程序可能会非常困难,设计师在这方面提供了很多帮助。调试事件驱动的应用程序也可能非常困难,因为您不再有顺序执行,而是执行从一个事件处理程序跳到另一个,因此使用事件跟踪程序会有很大帮助。

前两个选项是基本C++标准的一部分,函数回调也与C代码兼容。

另外两个选项需要分别使用boost和Qt。

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

您可以使用Observer设计模式。下面是它的C++源代码示例。http://sourcemaking.com/design_patterns/observer/cpp/3