В моем проекте у меня есть генератор идентификаторов для типов, которые выглядят примерно так:
class Family {
static std::size_t identifier;
template<typename...>
static std::size_t family() {
static const std::size_t value = identifier++;
return value;
}
public:
template<typename... Type>
inline static std::size_t type() {
return family<std::decay_t<Type>...>();
}
};
std::size_t Family::identifier{};
Использование:
const auto id = Family::type<FooBar>();
Он отлично подходит для моих целей, но имеет некоторые ограничения. Наиболее раздражающим (цель вопроса) является то, что он не работает при использовании исполняемым файлом, который ссылается на разделяемые библиотеки, если все они пытаются создать идентификаторы. Обычно результат состоит в том, что n-й идентификатор присваивается разным типам через границы, потому что каждая разделяемая библиотека поддерживает свой отдельный Family::identifier
.
Некоторые ребята из разделяемой библиотеки отметили, что более надежное решение было бы оценено, но не предложило тот, который не испортил производительность (почти все они представляют контейнеры, обнаруживают функциональные возможности и распределение памяти).
Существует ли альтернативный подход, который работает с вышеупомянутыми ограничениями, не теряя при этом производительности текущего проекта?
Я искал SO и нашел интересные ответы. Многим из них было несколько лет. Я хотел бы исследовать решения до последней версии стандарта вместо этого, если интерфейс существующего класса остается неповрежденным.
Это самое интересное. Он использует адреса статических членов для достижения того же, но не соответствует идее последовательно генерируемых идентификаторов
Примечание: использование RTTI, к сожалению, не является вариантом.
Примечание: идентификаторы должны генерироваться последовательно и начиная с 0, как в представленном выше решении.