Есть ли хороший шаблон для создания уникального идентификатора на основе типа?

У меня есть шаблон, который создает уникальный идентификатор для каждого экземпляра типа. Вот упрощенная версия шаблона:

template <typename T>
class arType {
  static const arType Id; // this will be unique for every instantiation of arType<>.
}

// Address of Id is used for identification.
#define PA_TYPE_TAG(T) (&arType<T >::Id)

Это работает, когда у вас есть исполняемый файл, состоящий исключительно из статических библиотек. К сожалению, мы переходим к исполняемому файлу, состоящему из dll. Каждая DLL потенциально может иметь свою собственную копию идентификатора для типа.

Одним из очевидных решений является явное создание экземпляров всех экземпляров arType. К сожалению, это громоздко, и я хотел бы спросить, может ли кто-нибудь предложить лучшее решение?


person Michael Kelley    schedule 16.03.2010    source источник
comment
Вы можете взглянуть на stackoverflow .com/questions/1708458/   -  person James McNellis    schedule 16.03.2010
comment
Один очевидный вопрос: почему вы думаете, что вам нужно это делать?   -  person    schedule 17.03.2010
comment
Я хочу иметь возможность хранить уникальный идентификатор во время выполнения и использовать его для сравнения. Одним из мест, где мы его используем, является таблица преобразования между типами.   -  person Michael Kelley    schedule 17.03.2010
comment
@Michael Многие из нас обходились без уникальных идентификаторов типов на протяжении всей своей карьеры. Вы действительно думаете, что у вас есть какая-то уникальная проблема, которая требует их? Я не хочу показаться грубым — я предлагаю вам задать вопрос о вашей основной проблеме, а не о вашем предполагаемом решении.   -  person    schedule 17.03.2010
comment
@Йоханнес: Чего? Другой вопрос не касается проблем согласованности.   -  person GManNickG    schedule 17.03.2010
comment
@GMan stackoverflow.com/questions/922442/ . Был еще вопрос, но сейчас не могу найти.   -  person Johannes Schaub - litb    schedule 17.03.2010
comment
@Johannes: О, понятно. :3   -  person GManNickG    schedule 17.03.2010


Ответы (3)


Возвратите объект std::type_info из функции для каждого объекта и используйте оператор == для результата. Вы можете отсортировать их с помощью функции before(), которая возвращает порядок сортировки.

Он специально разработан, чтобы делать то, что вы хотите. Вы можете обернуть его непрозрачным типом «id» с оператором‹, если хотите скрыть, как он работает внизу.

http://www.cplusplus.com/reference/std/typeinfo/type_info/< /а>

person Matthew Herrmann    schedule 21.03.2010
comment
Это то, что я в конечном итоге сделал, и, похоже, это сработало. Не так быстро, как проверка указателя, но да ладно... - person Michael Kelley; 22.03.2010

Да, и это проще, чем вы думаете:

template<...> class withAnID {
    static void idFunction(){};
}

Использование:

&withAnID<...>::idFunction;

Поскольку каждый экземпляр шаблона получает собственную сборку, каждая функция имеет уникальный (сортируемый!) адрес, и вы можете просто использовать его для их идентификации.

person Narfanator    schedule 16.03.2010
comment
Через DLL? Я так не думаю. Это ничем не отличается от решения, которое есть у ОП. - person GManNickG; 17.03.2010
comment
Спасибо, Нарфанатор, но GMan прав. Я ищу решение, которое работает с DLL. - person Michael Kelley; 17.03.2010

Ну, я думаю, что единственный способ - запрограммировать метод обработки идентификаторов, который учитывает проблему с DLL :)

Я имею в виду, что если вы можете вычислить идентификатор глобального типа как «идентификатор DLL» + «идентификатор локального типа DLL», у вас есть то, что вы хотите. Я думаю, что это может быть осуществимо, если вы управляете частью загрузки DLL или если ОС дает вам обратные вызовы для управления этим. Если вы можете установить уникальный идентификатор в объекте, привязанном к DLL, все готово ;-)

Я не эксперт в управлении Windows DLL, но я помню, что есть что-то вроде обратного вызова «on_dll_load», который может помочь. Любой специалист по управлению DLL?

Просто мои 2 цента...

person neuro    schedule 18.03.2010