我正在尝试确定以下方案是否适合模板,如果适用,我们将如何完成。
我有一个基类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);
但是我为制作一个宏而犹豫不决。
模板是否支持可变数量的参数?如果是这样,那怎么办?
答案 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。