我正在尝试为c ++中的actor实现消息处理。 scala中的以下代码是我试图在c ++中实现的东西
def receive = {
case Message1 =>{/* logic code */}
case Message2 =>{/* logic code */}
}
因此,我们的想法是为各种消息类型创建一组处理函数,并创建一个调度方法以将消息路由到其适当的消息处理程序。所有消息都将扩展基本消息类型。
解决此问题的最佳方法是什么:
维护一个Map(Message_type,function_pointer),dispatch方法将检查地图并调用适当的方法。但是,这种映射需要在Actor类中手动完成。
我读了这个library,lbrary正在按照我想要的方式处理消息,但是我无法理解他们如何在第56行创建的lambda函数上进行模式匹配。
我很感激任何建议或阅读链接,可以让我更接近这个问题的解决方案。
答案 0 :(得分:2)
既然您已经提到了CAF:为什么要实现自己的actor库而不是使用CAF?如果您将lib作为练习编写,我建议您开始阅读libcaf_core/caf/match_case.hpp
,libcaf_core/caf/on.hpp
和libcaf_core/caf/detail/try_match.hpp
。这是"核心" CAF的模式匹配工具。请注意,您将看到很多的元编程代码。该代码旨在由C ++专家阅读。它绝对不是学习这些技术的好地方。
我可以勾勒出正在发生的事情。
match_case
中detail::behavior_impl
个对象的列表
message_handler
和behavior
存储指向behavior_impl
others >> ...
)on(...) >> ...
表示法message
个对象中存储的元组进行匹配
match_case
个对象的列表
我们在模式匹配实现上付出了很多努力,以便在用户端获得高级别和干净的界面。但这并不容易。因此,如果您将此作为练习,请注意您需要大量的元编程经验来理解代码。
如果您不这样做是为了练习,我会感兴趣的是您认为CAF不会涵盖您的用例,也许我们可以说服您参与其开发而不是从头开发其他东西。 ;)
答案 1 :(得分:0)
尝试使用sobjectizer(包括电池)或rotor(仍处于实验阶段,但类似于轻型演员的解决方案)。