c ++ 11 — получение сообщений для актерской системы c ++

Я пытаюсь реализовать обработку сообщений для актеров в C ++. Следующий код в Scala это то, что я пытаюсь реализовать в C ++

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

Таким образом, идея состоит в том, чтобы создать набор функций-обработчиков для различных типов сообщений и создать метод отправки для направления сообщения в соответствующий обработчик сообщений. Все сообщения будут расширять базовый тип сообщения.

Какой будет лучший подход для решения этой проблемы:

  1. Поддерживая карту (Message_type, function_pointer), метод отправки проверит карту и вызовет соответствующий метод. Это отображение, однако, должно быть сделано вручную в классе Actor.

  2. Я читаю это библиотека, Библиотека обрабатывает сообщения именно так, как я хочу, но я не могу понять, как они выполняют сопоставление с образцом в лямбда-функциях, созданных в строке 56.

Буду признателен за любое предложение или чтение ссылок, которые могут приблизить меня к решению этой проблемы.

2

Решение

Поскольку вы уже упомянули CAF: почему вы хотите реализовать собственную библиотеку актеров вместо использования CAF? Если вы пишете библиотеку в качестве упражнения, я предлагаю начать читать libcaf_core/caf/match_case.hpp, libcaf_core/caf/on.hpp а также libcaf_core/caf/detail/try_match.hpp, Это «ядро» средства сопоставления с образцом CAF. Будьте предупреждены, вы будете смотреть на много метапрограммирования кода. Код предназначен для чтения экспертами C ++. Это определенно не очень хорошее место для изучения техник.

Хотя я могу обрисовать, что происходит.

  • CAF сохраняет шаблоны в виде списка match_case объекты в detail::behavior_impl
    • Вы никогда не получите указатель ни на один из них как пользователь
    • message_handler а также behavior сохранить указатель на behavior_impl
  • Соответствия могут быть сгенерированы по-разному:
    • Прямо из обратных вызовов / лямбд (тривиальный случай)
    • Использование правила всеобщего охвата (через others >> ...)
    • Используя передовые on(...) >> ... обозначение
  • CAF может сопоставляться только с кортежами, хранящимися в message объекты
    • «Эмулирует» (подмножество) отражений
    • Значения и метаинформация (то есть информация о типе) необходимы
  • Для самого сопоставления CAF просто перебирает список match_case объекты
    • Попробуйте сопоставить ввод с каждым случаем
    • Остановка при первом совпадении (как это делают функциональные языки)

Мы приложили много усилий для реализации сопоставления с образцом, чтобы получить высокоуровневый и чистый интерфейс на стороне пользователя. Это не легко, хотя. Так что, если вы делаете это как упражнение, имейте в виду, что вам нужно много опыта метапрограммирования, чтобы понять код.

Если ты не сделайте это в качестве упражнения, мне было бы интересно, почему вы считаете, что CAF не охватывает ваш вариант использования, и, возможно, мы сможем убедить вас принять участие в его разработке, а не разрабатывать что-то еще с нуля. 😉

2

Другие решения