Есть ли хороший шаблон для создания уникального идентификатора на основе типа? - PullRequest
1 голос
/ 16 марта 2010

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

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. Каждая библиотека может иметь собственную копию идентификатора для типа.

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

Ответы [ 3 ]

1 голос
/ 21 марта 2010

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

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

http://www.cplusplus.com/reference/std/typeinfo/type_info/

0 голосов
/ 18 марта 2010

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

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

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

Только мои 2 цента ...

0 голосов
/ 17 марта 2010

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

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

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

&withAnID<...>::idFunction;

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

...