C ++ actor系统的消息接收

Message receive for c++ actor system

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

中实现的
def receive = {
    case Message1 =>{/* logic code */}
    case Message2 =>{/* logic code */}
 } 

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

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

  1. 维护一个Map(Message_type,function_pointer),dispatch方法会检查map并调用合适的方法。但是,此映射需要在 Actor class.

  2. 中手动完成
  3. 我读了这篇文章library,lbrary 完全按照我的意愿处理消息,但我不明白他们如何对第 56 行创建的 lambda 函数进行模式匹配。

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

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

不过我可以概述一下发生了什么。

  • CAF 将模式存储为 detail::behavior_implmatch_case 个对象的列表
    • 作为用户,您永远不会得到指向任何一个的指针
    • message_handlerbehavior 存储指向 behavior_impl
    • 的指针
  • 可以以不同方式生成匹配案例:
    • 直接来自 callbacks/lambdas(小案例)
    • 使用包罗万象的规则(通过 others >> ...
    • 使用高级 on(...) >> ... 表示法
  • CAF 只能匹配存储在 message 个对象中的元组
    • "Emulates" 反射(的子集)
    • 需要值和元信息(即类型信息)
  • 对于匹配本身,CAF 简单地遍历 match_case 个对象的列表
    • 尝试将输入与每个案例匹配
    • 在第一次匹配时停止(就像函数式语言实现的那样)

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

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

尝试使用sobjectizer (batteries included) or rotor(仍处于试验阶段,但相当轻量级的类似 actor 的解决方案)。