收到c ++ actor系统的消息

时间:2015-04-13 20:06:17

标签: c++ c++11 lambda actor messages

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

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

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

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

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

  2. 我读了这个library,lbrary正在按照我想要的方式处理消息,但是我无法理解他们如何在第56行创建的lambda函数上进行模式匹配。

  3. 我很感激任何建议或阅读链接,可以让我更接近这个问题的解决方案。

2 个答案:

答案 0 :(得分:2)

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

我可以勾勒出正在发生的事情。

  • CAF将模式存储为match_casedetail::behavior_impl个对象的列表
    • 你永远不会得到一个指向任何一个用户的指针
    • message_handlerbehavior存储指向behavior_impl
    • 的指针
  • 匹配案例可以不同方式生成:
    • 直接来自callbacks / lambdas(普通案例)
    • 使用无限量规则(通过others >> ...
    • 使用高级on(...) >> ...表示法
  • CAF只能与message个对象中存储的元组进行匹配
    • "模拟" (反射的一个子集)
    • 需要值和元信息(即类型信息)
  • 对于匹配本身,CAF只是遍历match_case个对象的列表
    • 尝试将输入与每个案例匹配
    • 第一场比赛停止(就像功能语言实现这一点一样)

我们在模式匹配实现上付出了很多努力,以便在用户端获得高级别和干净的界面。但这并不容易。因此,如果您将此作为练习,请注意您需要大量的元编程经验来理解代码。

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

答案 1 :(得分:0)

尝试使用sobjectizer(包括电池)或rotor(仍处于实验阶段,但类似于轻型演员的解决方案)。