ishellstrike писал(а):ну это сильное заявление, у хеша, конечно бывают коллизии, но шанс этого довольно маленький.
Маленький он или нет, это уже какое-то стохастическое программирование получается; может, значит полагаться нельзя =(
ishellstrike писал(а):А вообще проще сделать штуку, вроде
Ага, я даже начал писать об этом в качестве работы над ошибками, но вы успели раньше. Тут только нюанс, что шаблон не получится использовать полиморфно в рантайме: например, нельзя вызвать метод базового класса, который сам проинспектирует объект и вернет идентификатор. Пришлось бы переопределять этот медод и его возвращаемое значание в каждом наследнике (или да, заполнять дополнительное поле в конструкторе каждого наследника), что определенно утомительно. Самое опрятное, что у меня получалось сделать, это использовать CRTP:
Код: Выделить всё
struct Event {
virtual ~Event() { }
virtual int getId() = 0;
};
template<typename T> struct NumberedEvent: Event {
int getId() {
return getNumericTypeId<T>();
}
};
struct UpdateEvent: NumberedEvent<UpdateEvent> {
// ...
};
Как минимум, это переносит "инициализацию" значения в объявление типа и все-таки использует имена вместо дополнительного списка констант.
Also, саму функцию NextTid нельзя объявлять static, потому что тогда получится несколько независимых next_id. Зато ее можно объявить inline и это гарантирует, что static size_t next_id будет одна на все приложение.