Для этого и нужны шаблоны. Их можно использовать с постоянными интегральными параметрами, которые также должны быть известны во время компиляции:
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;
Код, специфичный для каждого типа события, может быть реализован как специализация шаблона.