我正在尝试用 C++ 实现参与者的消息处理。 scala 中的以下代码是我尝试在 c++ 中实现的代码
def receive = {
case Message1 =>{/* logic code */}
case Message2 =>{/* logic code */}
}
因此,我们的想法是为各种消息类型创建一组处理程序函数,并创建一个调度方法以将消息路由到其适当的消息处理程序。所有消息都将扩展基本消息类型。
解决此问题的最佳方法是什么:
维护一个Map(Message_type, function_pointer),dispatch方法会检查map并调用适当的方法。然而,这种映射需要在 Actor 类中手动完成。
我读了这篇文章 library ,库正在完全按照我想要的方式处理消息,但我无法理解它们如何对第 56 行创建的 lambda 函数进行模式匹配。
如果有任何建议或阅读链接可以让我更接近解决这个问题,我将不胜感激。
最佳答案
既然您已经提到了 CAF:为什么您想要实现自己的 Actor 库而不是使用 CAF?如果您将编写该库作为练习,我建议开始阅读 libcaf_core/caf/match_case.hpp
、libcaf_core/caf/on.hpp
和 libcaf_core/caf/detail/try_match.hpp
。这是 CAF 模式匹配工具的“核心”。请注意,您将看到大量元编程代码。该代码供 C++ 专家阅读。这绝对不是学习技术的好地方。
不过,我可以概述正在发生的事情。
- CAF 将模式存储为
detail::behavior_impl
中的match_case
对象列表- 作为用户,您永远不会获得指向其中任何一个的指针
message_handler
和behavior
存储指向behavior_impl
的指针
- 可以通过不同方式生成匹配案例:
- 直接来自回调/lambda(简单情况)
- 使用包罗万象的规则(通过
others >> ...
) - 使用高级
on(...) >> ...
表示法
- CAF 只能匹配存储在
message
对象中的元组- “模拟”(一部分)反射
- 需要值和元信息(即类型信息)
- 对于匹配本身,CAF 只需迭代
match_case
对象列表- 尝试将输入与每种情况进行匹配
- 在第一个匹配处停止(就像函数式语言实现这一点一样)
我们在模式匹配实现上投入了大量精力,以便在用户端获得一个高级且干净的界面。但这并不容易。因此,如果您将此作为练习,请注意您需要大量元编程经验才能理解代码。
如果您不将此作为练习,我会感兴趣为什么您认为 CAF 不涵盖您的用例,也许我们可以说服您参与其开发而不是开发从头开始的其他东西。 ;)
关于c++ - C++ Actor 系统的消息接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29614104/