我正在尝试为c++中的actor实现消息处理。我正在尝试在c++中实现以下scala中的代码

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

因此,该想法是为各种消息类型创建一组处理函数,并创建一个分派(dispatch)方法以将消息路由到其适当的消息处理程序。所有消息将扩展基本消息类型。

解决此问题的最佳方法是:
  • 维护一个Map(Message_type,function_pointer),dispatch方法将检查 map 并调用适当的方法。但是,此映射需要在Actor类中手动完成。
  • 我阅读了此library,图书馆完全按照我的意愿处理消息,但我无法理解它们如何在第56行创建的lambda功能上进行模式匹配。

  • 我将不胜感激任何建议或阅读链接,它们可以使我更接近解决此问题的方法。

    最佳答案

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

    我可以概述发生的事情。

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

  • 我们在模式匹配实现中付出了很多努力,以在用户端获得高级且干净的界面。不过,这并不容易。因此,如果您是在做练习,请警告您需要大量的元编程经验来理解代码。

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

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

    10-10 11:22