В настоящее время я реализую библиотеку актеров для C ++ под названием "acedia" (в Google пока ничего об этом нет), которая использует "сопоставление типов". Библиотека - это проект для моей магистерской работы, и вы можете отправлять любые данные актеру вместе с ним.
Небольшой фрагмент:
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"; Это означает, что вы хотите соответствовать только типам.
Это, конечно, маленький фрагмент. Также вы можете использовать «case-классы», как в Scala. Они сопоставимы с «атомистикой» в эрланге. Вот более подробный пример:
ACEDIA_DECLARE_CASE_CLASS(ShutdownMessage)
ACEDIA_DECLARE_CASE_CLASS(Event1)
ACEDIA_DECLARE_CASE_CLASS(Event2)
Чтобы отреагировать на определенные классы дел, вы можете написать актера следующим образом:
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);
}
};
Чтобы создать нового актера и запустить его, все, что вам нужно написать, это:
Acedia::spawn<SomeActor>();
Хотя библиотека еще не достигла бета-стадиона, показанные фрагменты работают, и у меня на нем работает первое приложение. Одной из основных целей библиотеки является поддержка распределенного программирования (также через сеть).
Ваш вопрос давно, но если он вам интересен, дайте мне знать! :)