c++ - C++ Actor 系统的消息接收

标签 c++ c++11 lambda actor message

我正在尝试用 C++ 实现参与者的消息处理。 scala 中的以下代码是我尝试在 c++ 中实现的代码

def receive = {
    case Message1 =>{/* logic code */}
    case Message2 =>{/* logic code */}
 } 

因此,我们的想法是为各种消息类型创建一组处理程序函数,并创建一个调度方法以将消息路由到其适当的消息处理程序。所有消息都将扩展基本消息类型。

解决此问题的最佳方法是什么:

  1. 维护一个Map(Message_type, function_pointer),dispatch方法会检查map并调用适当的方法。然而,这种映射需要在 Actor 类中手动完成。

  2. 我读了这篇文章 library ,库正在完全按照我想要的方式处理消息,但我无法理解它们如何对第 56 行创建的 lambda 函数进行模式匹配。

如果有任何建议或阅读链接可以让我更接近解决这个问题,我将不胜感激。

最佳答案

既然您已经提到了 CAF:为什么您想要实现自己的 Actor 库而不是使用 CAF?如果您将编写该库作为练习,我建议开始阅读 libcaf_core/caf/match_case.hpplibcaf_core/caf/on.hpplibcaf_core/caf/detail/try_match.hpp。这是 CAF 模式匹配工具的“核心”。请注意,您将看到大量元编程代码。该代码供 C++ 专家阅读。这绝对不是学习技术的好地方。

不过,我可以概述正在发生的事情。

  • CAF 将模式存储为 detail::behavior_impl 中的 match_case 对象列表
    • 作为用户,您永远不会获得指向其中任何一个的指针
    • message_handlerbehavior 存储指向 behavior_impl 的指针
  • 可以通过不同方式生成匹配案例:
    • 直接来自回调/lambda(简单情况)
    • 使用包罗万象的规则(通过others >> ...)
    • 使用高级 on(...) >> ... 表示法
  • CAF 只能匹配存储在 message 对象中的元组
    • “模拟”(一部分)反射
    • 需要值和元信息(即类型信息)
  • 对于匹配本身,CAF 只需迭代 match_case 对象列表
    • 尝试将输入与每种情况进行匹配
    • 在第一个匹配处停止(就像函数式语言实现这一点一样)

我们在模式匹配实现上投入了大量精力,以便在用户端获得一个高级且干净的界面。但这并不容易。因此,如果您将此作为练习,请注意您需要大量元编程经验才能理解代码。

如果您将此作为练习,我会感兴趣为什么您认为 CAF 不涵盖您的用例,也许我们可以说服您参与其开发而不是开发从头开始的其他东西。 ;)

关于c++ - C++ Actor 系统的消息接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29614104/

相关文章:

c++ - 无法通过 C++ vector 进行解析

c++ - 使用 C++11 选项编译 C++98 代码时,由于 Boost header 导致的不明确重载

c# - 在 Lambda 表达式中检查 Null 的简洁方法

用于自定义监听器的 Android 数据绑定(bind)库 lambda

c++ - std::basic_fstream 和 std::unique_lock 的接口(interface)设计

c++ - 物理内存量随着我释放 block 而增加

c++ - unique_ptr 的 vector ,继承?

c++ - 等效于范围枚举的 "using namespace X"?

java - 使用 for 循环生成 30 个 lambda 表达式

C++ 通过引用交换值