模板是否支持可变数量的参数

时间:2010-07-16 00:36:36

标签: c++ templates

我正在尝试确定以下方案是否适合模板,如果适用,我们将如何完成。

我有一个基类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 个答案:

答案 0 :(得分:1)

没有

在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

答案 1 :(得分:1)

可变参数模板是正在进行的C ++ 0x功能。从GCC 4.3开始,您至少可以开始使用它们。我不太关注微软。

答案 2 :(得分:1)

C ++不支持可变参数模板,但C ++ 0x会支持,而且有些编译器已经支持这种模式(包括带有--std=c++0x标志的G ++)。维基百科有examples of how to use this feature