не будет плохо
тировать: выделение актуального вопроса с большим количеством контекста, если необходимо.
Я хочу реализовать следующий метод:
template <typename T>
<unspecified> type_identification();
Для универсального типа T он должен возвращать (относительно) уникальную идентификацию, которая является стабильной в течение нескольких вызовов одной и той же программы и может использоваться для межпроцессного взаимодействия (поэтому нет решений на основе указателей).
Могут быть использованы специфичные для компилятора макросы / расширения / встроенные функции, предпочтительно доступные как для MSVC, так и для Clang.
Я рассмотрелstd::type_info::hash_code
, или жеstd::type_info::name
но оба из них не могут гарантировать один и тот же вывод при нескольких вызовах одной и той же программы.
Пытаясь избежатьXY-проблема немедленно объясняя проблему, которую я пытаюсь решить.
Я написал код для общего хранения данных в файле для последующего использования. Каждой так называемой записи в файле присваивается метка кодом приложения, которую она должна использовать для доступа к той же записи в последующем вызове программы. API в основном сводится к:
template <typename T>
void make(const std::string &name, T value);
template <typename T>
T get(const std::string &name);
Обратите внимание, что это просто пример кода.
Когда код приложения обращается к значению черезget<T>
, он явно указывает тип записи, так что реализация может использоватьreinterpret_cast
предоставить доступ к записи как фактический тип, а не какvoid *
.
Предположим ради этого вопроса, что все опасности и подводные камни в отношенииreinterpret_cast
и постоянные данные в файл были приняты во внимание.
Чтобы избежать неприятных сбоев, потому что код приложения испортил аргумент шаблона, я хотел бы добавить некоторую идентификацию типа для каждой записи в файле. В основном, когда код приложения делает что-то вроде:
make("integer", 5);
auto a = get<std::string>("integer");
Я хотел бы выдать исключение, указывающее на несоответствие фактического типа и запрашиваемого типа.