Поддерживают ли шаблоны переменное количество параметров - PullRequest
1 голос
/ 16 июля 2010

Я пытаюсь определить, подходит ли следующий сценарий для шаблона, и если да, то как это будет сделано.

У меня есть базовый класс, event_base.Он наследуется определенными типами событий.

class event_base_c {
    //... members common to all events ...

    // serialize the class for transmision
    virtual std::string    serialize(void);
};


class event_motion_c : public event_base_c {
  //... members for a motion event ...

  // serialize the class for transmission
  virtual std::string    serialize(void);
};


class event_alarm_c : public event_base_c {
  //... members for a motion event ...

  // serialize the class for transmission
  virtual std::string    serialize(void);
};

События сериализуются и отправляются из одного процесса в журнал событий, который воссоздает объект события из сериализованных данных.

Мой вопросотносится к процессам, которые отправляют события.Мы не можем включить метод send () в класс событий.Мне сказали, что мне нужно создать объект event_sender, который знает, как отправить сериализованное событие.Таким образом, код из одного процесса может быть:

if (motion_detected on sensor1) {
    event_motion_c    Event(sensor1, x, y, z);
    event_sender      EventSender;

    EventSender.report(Event.serialize());
}

В то время как какой-то другой процесс может сообщить о тревоге, используя подобный код, такой как:

if (alarm) {
    event_alarm_c     Event(alarm_id, alarm_type);
    event_sender      EventSender;

    EventSender.report(Event.serialize());
}

Это похоже на кандидата в шаблон для меня,но что останавливает / смущает меня, так это то, что конструктор для разных классов событий имеет разное количество параметров.Я не знаю, поддерживают ли шаблоны что-то подобное, и если они это делают, я не знаю синтаксис для этого.

Я мог бы легко определить это как макрос, такой как:

#define SEND_EVENT(evt_class, args...)          \
    {                                           \
        evt_class       Event(#args);           \
        event_sender    EventSender;            \
                                                \
        EventSender.report(Event.serialize());  \
    }

Тогда кодер просто использовал бы:

SEND_EVENT(event_motion_c, sensor1, x, y, z);

и

SEND_EVENT(event_alarm_c, alarm_type);

Но я не решаюсь сделать для этого макрос.

Поддерживают ли шаблоны переменнуюномера параметров?И если да, то как это сделать?

Ответы [ 3 ]

1 голос
/ 16 июля 2010

Шаблоны Variadic являются текущей функцией C ++ 0x. Вы смогли по крайней мере начать использовать их с GCC 4.3 . Я не обращаю особого внимания на Microsoft.

1 голос
/ 16 июля 2010

C ++ не поддерживает шаблоны переменных, но C ++ 0x будет, и некоторые компиляторы уже поддерживают это (включая G ++ с флагом --std=c++0x). В Википедии есть примеров использования этой функции .

1 голос
/ 16 июля 2010

нет.

В C ++ шаблоны переменных не поддерживаются. Но вы можете легко преодолеть это, задав шаблоны по умолчанию:

template<class I, class J = void>
struct S;

template<class, class> struct S {}; // two parameter
template<class I> struct S<I> {}; //  "single" parameter, second parameter is void

S<int, int>; // two parameter instance
S<int>; // "single" parameter instance

значение по умолчанию не должно быть типа void, это может быть что угодно.

иногда стиль может стать слишком запутанным (если у вас много настроек по умолчанию), тогда вы можете использовать препроцессор boost, а именно:

http://www.boost.org/doc/libs/1_43_0/libs/preprocessor/doc/ref/enum_params_with_a_default.html

http://www.boost.org/doc/libs/1_43_0/libs/preprocessor/doc/ref/enum_params.html

http://www.boost.org/doc/libs/1_43_0/libs/preprocessor/doc/ref/enum_binary_params.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...