#c #parameter-pack
#c #parameter-pack
Вопрос:
Я пытаюсь создать конечный автомат только для перехода на основе шаблонных параметров, который может вызывать функции-члены другого данного объекта.
Итак, отдельное состояние — это отдельный класс. У него должен быть свой идентификатор состояния, а также должны быть указаны все возможные события с его конкретной функцией перехода в конкретное состояние.
То, что я пробовал, было следующим:
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).
Комментарии:
1. Параметр шаблона, который сам по себе является шаблоном, должен быть указан… как шаблон, а не конкретный экземпляр шаблона. То есть, если ваш параметр шаблона равен a
template<typename T>
и у вас есть atemplate<typename T> foo
, то соответствующий параметр равенfoo
, а неfoo<x>
илиfoo<y>
. Помимо этого, неясно, что представляет собой остальная часть вашей программы и что она должна делать.2. Может быть, просто
template<uint8_t state_id, class... EventAction> class State {};
? Я имею в виду — судя по тому, как вы пытаетесь это вызвать, — кажется, вам просто нужен класс, а не шаблон класса. Возможно, я ошибаюсь, но вам нужно показать нам, что вы на самом деле хотите сделать с eventAction pack, чтобы знать наверняка?3. @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, amp;SystemTask::actionConfigure, S_START_ID>>
4. Здорово, что я мог бы помочь. Я включил наше обсуждение в полный ответ — пожалуйста, примите его, чтобы показать, что это решение вашей проблемы (для подписчиков).
Ответ №1:
Скорее всего, подход с шаблоном класса в этом случае является чрезмерно сложным (чрезмерным).
Попробуйте просто пакет классов:
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>>
{};