Я хочу создать уникальный идентификатор, «комбинируя» типы. Порядок типов ввода не имеет значения, и ввод одной и той же комбинации типов всегда должен возвращать один и тот же идентификатор (в той же среде выполнения). Я хочу использовать это в системе компонентов сущности для определения комбинаций компонентов.
Идея, которая почти выполняет свою работу:
class Archetype
{
public:
template <typename... Types>
static uint32_t CreateArchetype()
{
return GetArchetypeIndex<Types...>();
}
private:
template <typename... Types>
static uint32_t GetArchetypeIndex()
{
static uint32_t index = GetNewArchetypeIndex();
return index;
}
static uint32_t GetNewArchetypeIndex()
{
static uint32_t lastID = 0u;
return ++lastID;
}
};
int main()
{
std::cout << Archetype::CreateArchetype<uint16_t, uint32_t, int, bool>() << std::endl;
std::cout << Archetype::CreateArchetype<uint16_t, uint32_t, int, bool>() << std::endl;
// Same Types but different order
std::cout << Archetype::CreateArchetype<int, bool, uint16_t, uint32_t>() << std::endl;
std::cout << Archetype::CreateArchetype<int, bool, uint16_t, uint32_t>() << std::endl;
}
Output: 1, 1, 2, 2
Goal: 1, 1, 1, 1
Это вернет уникальный идентификатор, но не позаботится о порядке. Может быть, это можно исправить, как-то упорядочив типы в функции CreateArchetype()
с помощью некоторого «varadi c template sorting magi c», но мне не удалось этого сделать, возможно ли это или есть еще какие-то варианты?