Как заставить статическую переменную иметь одинаковое значение инициализации в разделяемой библиотеке и в основной программе в методе шаблонного класса? - PullRequest
0 голосов
/ 30 ноября 2018

Я создал класс TypeManager, который позволяет мне создавать Id для данного типа класса.Это простейшая версия метода, которая делает это возможным:

template<typename T>
int64_t getTypeId() {
    static int64_t type = typeCounter++;
    return type;
}

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

Как я могу сделать это, не имея разных идентификаторов для каждой общей библиотеки?Есть ли решение без статики?Может быть, я смогу сделать эту работу с флагом компиляции?

Заранее спасибо.

1 Ответ

0 голосов
/ 30 ноября 2018

Создать общую библиотеку.Он поддерживает карту от искаженного имени типа до индекса.

Назовите это int64_t get_type_integer( std::type_index ).Экспортируйте его, сделайте его потокобезопасным и т. Д.

Не вызывайте его.

Вместо этого вызовите

template<typename T>
int64_t getTypeId() {
  static int64_t type = details::get_type_integer(typeid(T));
  return type;
}

, теперь у каждого есть свой тип, который использует магическую статику длядоступа / INIT;get type integer вызывается только один раз для .so для каждого типа.Таким образом, код может быть написан безопасным, а не сверхбыстрым.

Используйте имена, а не type_index напрямую, потому что один и тот же тип в двух системах во многих системах может рассматриваться как разные типы, но может иметь один и тот же искаженный типимя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...