Как создать шаблонные вложенные пакеты параметров шаблона?

#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> и у вас есть a template<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>>
{};