Идентификатор типа С++ во время компиляции

Я хочу сгенерировать хэш для класса на основе его производного типа во время компиляции. Сегодня я генерирую это так:

template<class Type>
class TypeBase 
{
public:
    static const unsigned s_kID;
};

template<class Type>
const unsigned TypeBase<Type>::s_kID = hash(typeid(Type));

но это генерирует (довольно излишне) код инициализации времени выполнения (функция hash(..) делает простой хэш на основе std::type_info::name() )

Идеи?


person Robert    schedule 22.08.2011    source источник
comment
Нет ли риска, что вы получите коллизии хэшей, или, может быть, это не проблема?   -  person Andreas Brinck    schedule 22.08.2011
comment
@Andreas: При создании хэшей у меня также есть карта с хэш-записями. Таким образом, я могу проверить, есть ли коллизии. Кроме того, количество классов, может быть, 20, так что я думаю, что и с этим я в безопасности.   -  person Robert    schedule 22.08.2011
comment
Не могли бы вы просто сделать что-то вроде id = ++someGlobalCounter? (Я понимаю, что это не критично, просто любопытно)   -  person Andreas Brinck    schedule 22.08.2011
comment
@Andreas: этот класс используется в IPC-коммуникациях, и я не уверен, что глобальный счетчик обеспечит синхронизацию обеих взаимодействующих сторон (т. е. наличие одного и того же идентификатора для одного и того же типа). С хешем это гарантировано (если вы используете один и тот же компилятор C++ для обоих приложений).   -  person Robert    schedule 25.08.2011


Ответы (1)


Учитывая все остальное, что происходит при запуске процесса, и насколько прост и элегантен ваш существующий код, предполагая, что вы не хэшируете миллион типов, я бы оставил ваше существующее решение точно таким, какое оно есть.

person David Heffernan    schedule 22.08.2011
comment
Спасибо. Случай преждевременной оптимизации, а? ;) - person Robert; 22.08.2011
comment
Верно. Пока вы не оказываете никакого влияния на время выполнения, как пользователи, которые жалуются, что приложение загружается на 150 микросекунд слишком долго, оставьте все как есть. И не пытайтесь делать какую-либо магию приведения указателя этой переменной к беззнаковому, так как это не будет переносимым. - person PlasmaHH; 22.08.2011
comment
@robert да, мне кажется, что это так. - person David Heffernan; 22.08.2011
comment
Теперь я снова оказался в ситуации, когда мне снова нужна информация о типе, отличном от RTTI, для создания идентификатора просто потому, что я хочу лишить свой исполняемый файл символов RTTI :) - person Robert; 06.12.2011
comment
Как насчет вычисления хэша из адреса результирующего объекта type_info? Это должно быть еще дешевле и даже уникально, или нет? - person Tilman Vogel; 26.01.2012
comment
@TilmanVogel да, эту идею стоит изучить, но, возможно, она будет уникальной также для каждого выполнения приложения, в зависимости от того, где оно загружено, что сделает его бесполезным для IPC, но для внутренней связи это, вероятно, будет хорошо. - person Robert; 13.03.2012