Я пытаюсь создать конечный автомат только для действия перехода на основе шаблонных параметров, который может вызывать функции-члены другого заданного объекта.
Итак, отдельное государство — это единый класс. У него должен быть свой идентификатор состояния, а также должны быть заданы все возможные события с его конкретной функцией перехода в конкретное состояние.
Я пробовал следующее:
template<uint8_t state_id, template< class TObject, uint8_t Event, void (TObject::*Function)(void), uint8_t next_state_id> class... EventAction >
class State {}
где второй пакет параметров шаблона должен принимать несколько возможных переходов в соответствии с его конкретными событиями. (Конкретная обработка одного так называемого «EventAction» здесь не рассматривается) Пока компилятор не жалуется.
Но теперь я застрял в том, как правильно вызвать этот шаблон. Нужно ли создавать конкретный класс для шаблона пакета параметров? То, что я хочу посмотреть, как это использовать, будет примерно таким:
class S_START : public State<S_START_ID, <Object, E_E_GOSEC, actionDoOne, S_SECOND_STATE_ID>
, <Object, E_E_GOTHIRD, actionDoTwo, S_THIRD_STATE_ID>>
Я что-то напутал или мой подход неверен с самого начала?
Я могу использовать только C++11 и некоторые возможности C++14, но как-то не весь набор (специальный компилятор от TI).
Может просто template<uint8_t state_id, class... EventAction> class State {};
? Я имею в виду - судя по тому, как вы пытаетесь это назвать - кажется, вам просто нужен класс, а не шаблон класса. Я могу ошибаться, но вам нужно показать нам, что вы на самом деле хотите делать с пакетом EventAction, чтобы знать наверняка?
@PiotrNycz спасибо! Кажется, это именно то, что я хотел. Теперь он работает с: template< class TObject, uint8_t Event, void (TObject::*Function)(void), uint8_t next_state_id> class EventAction; template<uint8_t state_id, class... EventAction >
и определением производного класса, например: class S_START : public ::States::State<S_START_ID, ::States::EventAction<SystemTask, E_E_CONFIGURE, &SystemTask::actionConfigure, S_START_ID>>
Это здорово, что я мог помочь. Я помещаю наше обсуждение в полный ответ - пожалуйста, примите его, чтобы показать, что это решение вашей проблемы (для подписчиков).
Скорее всего, подход с шаблоном класса в этом случае слишком сложен.
Попробуйте просто пакет классов:
template<uint8_t state_id, class... EventAction>
class State {};
И использовать его как
class S_START
: public State<S_START_ID,
SomeTemplate<Object, E_E_GOSEC, actionDoOne, S_SECOND_STATE_ID>
SomeTemplate<Object, E_E_GOTHIRD, actionDoTwo, S_THIRD_STATE_ID>>
{};
Параметр шаблона, который сам является шаблоном, должен быть указан... как шаблон, а не конкретный экземпляр шаблона. То есть, если параметр вашего шаблона — это
template<typename T>
, а у вас естьtemplate<typename T> foo
, то соответствующий параметр — этоfoo
, а неfoo<x>
илиfoo<y>
. Кроме того, неясно, что представляет собой остальная часть вашей программы и что она должна делать.