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