我正在为C++实现一个名为“acedia”的演员库(谷歌上尚无相关信息),它使用“类型匹配”。该库是我的硕士论文项目,您可以使用它向演员发送任何类型的数据。
以下是一小段示例:
recipient.send(23, 12.23f)
在接收方面,您可以像这样分析接收到的消息:
Message msg = receive();
if (msg.match<int, float>() { ... }
或者您可以定义一个规则集,以便为您调用函数或方法:
void doSomething(int, float);
InvokeRuleSet irs;
irs.add(on<int, float>() >> doSomething);
receiveAndInvoke(irs);
匹配类型和值是可能的:
Message msg = receive();
if (msg.match<int, float>(42, WILDCARD) { ... }
else if (msg.match<int, float>() { ... }
常量“WILDCARD”表示任何值都将被接受。不传递参数等同于将所有参数设置为“WILDCARD”; 这意味着您只想匹配类型。
这确实是一个小片段。您也可以像在Scala中那样使用“case classes”。它们类似于erlang中的“原子”。以下是更详细的示例:
ACEDIA_DECLARE_CASE_CLASS(ShutdownMessage)
ACEDIA_DECLARE_CASE_CLASS(Event1)
ACEDIA_DECLARE_CASE_CLASS(Event2)
为了响应定义的案例类,您可以编写一个如下的Actor:
```scala
class MyActor extends Actor {
def receive = {
case CaseClass1 => // do something
case CaseClass2 => // do something else
case _ => // handle the default case
}
}
```
注意,这里的案例类是指Scala中的case class。
class SomeActor : public Actor
{
void shutdown() { done = true; }
void handleEvent1();
void handleEvent1();
public:
SomeActor() : done(false) { }
virtual void act()
{
InvokeRuleSet irs;
irs
.add(on<ShutdownMessage>() >> method(&SomeActor::shutdown))
.add(on<Event1>() >> method(&SomeActor::handleEvent1))
.add(on<Event2>() >> method(&SomeActor::handleEvent2))
;
while (!done) receiveAndInvoke(irs);
}
};
创建一个新的Actor并启动它,您只需要编写以下内容:
Acedia::spawn<SomeActor>()
尽管该库甚至还未达到测试版阶段,但所展示的片段是有效的,我已经在其上运行了一个应用程序。该库的一个主要目标是支持分布式编程(也跨越网络)。
你的问题有一段时间了,但如果你对它感兴趣,请告诉我! :)