Может быть, слишком поздно. Но этот метод очень простой и простой
Одна из важных вещей о erlang - то, как функции используются для создания устойчивых систем.
send/recieve модель без совместных использований, и явно копирование. Сами процессы являются легкими потоками.
Если бы Вы действительно требовали устойчивых свойств erlang модели, то Вы были бы лучшими для использования реальных процессов и IPC, а не потоков.
Если Вы хотите устойчивую передачу сообщений, хотя можно закончить тем, что желали сериализировать и десериализовать содержание. Особенно с безопасностью типов.
Сопоставление с образцом в C++ не всегда симпатично, но будет хороший шаблон для этого - Вы закончите тем, что создали объект диспетчера, который использует некоторую форму полиморфизма для получения то, что Вы хотите.
Хотя, если Вы не осторожны, Вы заканчиваете с xml по каналам :)
Действительно, если Вы хотите erlang модель, Вы действительно хотите использовать erlang. Если существуют медленные биты, я уверен, что можно увеличить программу с помощью внешнего функционального Интернета.
Проблема о перереализации частей, Вы, не получит хорошую связную библиотеку и решение. Решения, которые Вы имеете уже, больше не очень напоминают C++.
Что касается модели Actor, существуют существующие реализации как ACT ++ и Theron, но я ничего не мог найти кроме статей о первом, и последний является однопоточным только.
Как автор Theron, мне было любопытно, почему Вы полагаете, что это является однопоточным?
Лично, я реализовал поточную обработку использования агентов и ориентированную на многопотоковое исполнение очередь сообщений
Это - то, как Theron реализована..:-)
Пепел
В настоящее время я реализую библиотеку акторов для 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)
Чтобы реагировать на определенные классы case, вы можете написать актера следующим образом:
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>();
Хотя библиотека еще не достигла стадии бета-тестирования, показанные фрагменты работают, и у меня есть первое приложение, работающее на ней. Одна из основных целей библиотеки - поддержка распределенного программирования (в том числе и по сети).
Ваш вопрос задан недавно, но если он вам интересен: дайте мне знать! :)
Мне определенно было бы интересно взглянуть на вашу библиотеку "acedia" и я хотел бы помочь всем, чем мог бы. В Erlang есть несколько замечательных конструкций, и C ++ определенно выиграет от такой библиотеки.
Сегодня я разместил библиотеку на sourceforge: https://sourceforge.net/projects/acedia/
Как я уже говорил, это ранний выпуск. Но не стесняйтесь критиковать это!