Напишите класс, принимающий любой объект Callable с ограничениями. ⇐ C++
Напишите класс, принимающий любой объект Callable с ограничениями.
Я работаю над небольшим проектом, пытаясь создать систему, в которой у меня есть несколько экземпляров класса Rule, каждый из которых выполняет действие перед передачей управления следующему правилу в соответствии с результат действия. Действие может быть любым, может принимать любое количество параметров или ни одного, но всегда возвращает Message (перечисление). Я хотел бы иметь возможность написать действие более общим способом: как функцию, лямбда-выражение, указатель на функцию и т. д., чтобы я не был привязан к определенному синтаксису
Вот как на данный момент выглядит код
enum Сообщение { успех, отказ, ничего } класс BaseRule {}; Для шаблона требуется std::invocable Правило класса: public BaseRule { частный: std::map преемники; //функция, позволяющая связывать правила, в данный момент не используемая шаблон struct undef; // только для целей тестирования публика: F действие; Правило(F _action): действие(_action) {}; void addSuccessor(const Message, BaseRule*); void RemoveSuccessor (const Message); шаблон void выполнить(ExecuteArgs&&... args) { //выполняем действие и вызываем действие следующего правила в соответствии с возвращенным сообщением if constexpr (std::is_invocable_v) std::invoke(action, std::forward(args)...); еще undef _; // в целях тестирования ожидается ошибка и в сообщении об ошибке будут указаны типы F и ExecuteArgs }; }; класс приложения { частный: std::unordered_mapboundActions; публика: Для шаблона требуется std::invocable void bindInput(const unsigned int _key, BaseRule* _rule, Args... _args) { автоматически вызываемый = [_rule, _args...]() { static_cast(_rule)->execute(_args...); }; boundActions[_key] = вызываемый; }; Для шаблона требуется std::invocable void launch(Rule _startingPoint, Args... args) { _startingPoint.execute(args...); петля(); }; недействительный цикл() { пока (!выход) { for (unsigned int i = 0; i < 256; ++i) { если (downKeys) { авто это =boundActions.find(i); если (это !=boundActions.end()) это->секунда(); // Вызов сохраненного вызываемого объекта } } } }; }; интервал основной() { Приложение приложение = Приложение(); //приложение фиксируется в ламбе для выполнения некоторой логики Rule init = Rule([&app]() -> Сообщение { std::cout
Я работаю над небольшим проектом, пытаясь создать систему, в которой у меня есть несколько экземпляров класса Rule, каждый из которых выполняет действие перед передачей управления следующему правилу в соответствии с результат действия. Действие может быть любым, может принимать любое количество параметров или ни одного, но всегда возвращает Message (перечисление). Я хотел бы иметь возможность написать действие более общим способом: как функцию, лямбда-выражение, указатель на функцию и т. д., чтобы я не был привязан к определенному синтаксису
Вот как на данный момент выглядит код
enum Сообщение { успех, отказ, ничего } класс BaseRule {}; Для шаблона требуется std::invocable Правило класса: public BaseRule { частный: std::map преемники; //функция, позволяющая связывать правила, в данный момент не используемая шаблон struct undef; // только для целей тестирования публика: F действие; Правило(F _action): действие(_action) {}; void addSuccessor(const Message, BaseRule*); void RemoveSuccessor (const Message); шаблон void выполнить(ExecuteArgs&&... args) { //выполняем действие и вызываем действие следующего правила в соответствии с возвращенным сообщением if constexpr (std::is_invocable_v) std::invoke(action, std::forward(args)...); еще undef _; // в целях тестирования ожидается ошибка и в сообщении об ошибке будут указаны типы F и ExecuteArgs }; }; класс приложения { частный: std::unordered_mapboundActions; публика: Для шаблона требуется std::invocable void bindInput(const unsigned int _key, BaseRule* _rule, Args... _args) { автоматически вызываемый = [_rule, _args...]() { static_cast(_rule)->execute(_args...); }; boundActions[_key] = вызываемый; }; Для шаблона требуется std::invocable void launch(Rule _startingPoint, Args... args) { _startingPoint.execute(args...); петля(); }; недействительный цикл() { пока (!выход) { for (unsigned int i = 0; i < 256; ++i) { если (downKeys) { авто это =boundActions.find(i); если (это !=boundActions.end()) это->секунда(); // Вызов сохраненного вызываемого объекта } } } }; }; интервал основной() { Приложение приложение = Приложение(); //приложение фиксируется в ламбе для выполнения некоторой логики Rule init = Rule([&app]() -> Сообщение { std::cout
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Базовый класс, принимающий аргументы шаблона дочернего класса и внутреннего дочернего класса
Anonymous » » в форуме C++ - 0 Ответы
- 24 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Базовый класс, принимающий аргументы шаблона дочернего класса и внутреннего дочернего класса
Anonymous » » в форуме C++ - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-