2010-07-16 42 views
1

我在尝试确定以下场景是否适用于模板,如果是这样,将如何完成。模板是否支持可变数量的参数

我有一个基类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); 

但我很犹豫,使这是一个宏。

模板是否支持可变数量的参数?如果是这样,那是怎么做的?

回答

1

没有。

在C++ variadic模板不受支持。 但是你可以很容易地克服了通过给模板默认:

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 

默认不必是无效的类型,它可以是任何东西。

有时风格可能变得太乱了(如果你有很多默认的),那么你可以使用升压预处理,即:

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

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

相关问题