Мне нужен общий способ создания уникальных идентификаторов времени компиляции для любых пользовательских типов C ++.
Например:
unique_id<my_type>::value == 0 // true
unique_id<other_type>::value == 1 // true
Мне удалось реализовать что-то подобное с использованием мета препроцессора.программирование, проблема в том, что сериализация не соответствует.Например, если шаблон класса unique_id
сначала создается с other_type
, то любая сериализация в предыдущих ревизиях моей программы будет признана недействительной.
Я искал решения этой проблемы и нашел несколько способовреализовать это с помощью непоследовательной сериализации, если уникальные значения являются константами времени компиляции.Если используются RTTI или аналогичные методы, такие как boost::sp_typeinfo
, то уникальные значения, очевидно, не являются константами времени компиляции, и присутствуют дополнительные издержки.Специальным решением этой проблемы будет создание всех уникальных идентификаторов в отдельном заголовке в правильном порядке, но это требует дополнительного обслуживания и стандартного кода, который не отличается от использования enum unique_id{my_type, other_type};
.
Хорошим решением этой проблемы было бы использование пользовательских литералов, к сожалению, насколько мне известно, ни один компилятор не поддерживает их в данный момент.Синтаксис будет 'my_type'_id; 'other_type'_id;
с UDL.
Я надеюсь, что кто-нибудь знает хитрость, которая позволяет реализовать сериализуемые уникальные идентификаторы в C ++ с текущим стандартом (C ++ 03 / C ++ 0x), я был бы рад, если бы он работал с последнимистабильные компиляторы MSVC и GNU-G ++, хотя я ожидаю, что если есть решение, оно не переносимо.
Я хотел бы пояснить, что использование mpl::set
или подобных конструкций, таких как mpl::vector
и фильтрация, делаетне решить эту проблему, потому что область действия мета-набора / вектора ограничена и фактически вызывает больше проблем, чем просто метапрограммирование препроцессора.