我需要为Qt应用程序创建几个自定义事件类.
class MyEvent : public QEvent { public: MyEvent() : QEvent(registeredType()) { } static QEvent::Type eventType; private: static QEvent::Type registeredType(); } QEvent::Type MyEvent::eventType = QEvent::None; QEvent::Type MyEvent::registeredType() { if (eventType == QEvent::None) { int generatedType = QEvent::registerEventType(); eventType = static_cast<QEvent::Type>(generatedType); } return eventType; }
关于如何简化这个,或者至少用宏隐藏它的任何建议?
解决方法
这就是模板的用途.它们可以与常量积分参数一起使用,这些参数也需要在编译时知道:
enum EventNames { UpdateEvent,... } template<EventNames E> class MyEvent : public QEvent { public: MyEvent() : QEvent(registeredType()) { } static QEvent::Type eventType; private: static QEvent::Type registeredType(); }
公共代码如下所示:
template<EventNames E> QEvent::Type MyEvent<E>::registeredType() { if (eventType == QEvent::None) { int generatedType = QEvent::registerEventType(); eventType = static_cast<QEvent::Type>(generatedType); } return eventType; }
静态初始化(注意!)看起来像这样:
QEvent::Type MyEvent<UpdateEvent>::eventType = QEvent::None;
特定于每种事件类型的代码可以实现为模板特化.