Я пытаюсь реализовать обработку сообщений для актеров в C ++. Следующий код в Scala это то, что я пытаюсь реализовать в C ++
def receive = {
case Message1 =>{/* logic code */}
case Message2 =>{/* logic code */}
}
Таким образом, идея состоит в том, чтобы создать набор функций-обработчиков для различных типов сообщений и создать метод отправки для направления сообщения в соответствующий обработчик сообщений. Все сообщения будут расширять базовый тип сообщения.
Какой будет лучший подход для решения этой проблемы:
Поддерживая карту (Message_type, function_pointer), метод отправки проверит карту и вызовет соответствующий метод. Это отображение, однако, должно быть сделано вручную в классе Actor.
Я читаю это библиотека, Библиотека обрабатывает сообщения именно так, как я хочу, но я не могу понять, как они выполняют сопоставление с образцом в лямбда-функциях, созданных в строке 56.
Буду признателен за любое предложение или чтение ссылок, которые могут приблизить меня к решению этой проблемы.
Поскольку вы уже упомянули CAF: почему вы хотите реализовать собственную библиотеку актеров вместо использования CAF? Если вы пишете библиотеку в качестве упражнения, я предлагаю начать читать 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 не охватывает ваш вариант использования, и, возможно, мы сможем убедить вас принять участие в его разработке, а не разрабатывать что-то еще с нуля. 😉