В настоящее время я работаю над системой компонент-сущность, в которой мне нужно создавать уникальные идентификаторы для разных типов компонентов, желательно без хранения каких-либо дополнительных данных в классе компонентов (поскольку для этого потребуются статические виртуальные методы, которые не работают, и поэтому мне нужно будет создавать экземпляр нового компонента каждый раз, когда я что-то сравниваю). Подход, к которому я пришел, заключался в создании шаблонного метода:
/*statically instances unique pointers for different
TComponents - each with their own templated instance*/
template<typename TComponent>
static const COMP_ID& GetTComponentID()
{
DERIVES_FROM_COMPONENT_ASSERT;
static COMP_ID ID = Component::NewID();
return ID;
}
а затем иметь статический метод в моем базовом классе компонентов, который возвращает уникальный идентификатор каждый раз, когда новый статический COMP_ID инициализируется в GetTCompomponentID ():
//retrieves static data identifier
static const COMP_ID& NewID()
{
static COMP_ID currID = 0;
currID++;
return currID;
}
Используя это, я могу создавать уникальные статические идентификаторы для каждой производной компонента, которые я использую, без необходимости хранить данные в самом классе как виртуальную функцию (которая не может быть статической, поэтому каждый раз, когда требуется сравнение, потребуется новый экземпляр)
Есть ли какие-либо основные проблемы при использовании такой системы, кроме очевидной дополнительной памяти, используемой членами статического метода?
-Благодарность
static
локальные переменные являются излишними, поскольку они всегда защищены флагом мьютекса / атомарности. Подробнее см. здесь. - person rustyx   schedule 16.03.2021std::type_index(typeid(T))
, если вам нужен уникальный идентификатор типа, это не должно вызывать дополнительных затрат времени выполнения. В большинстве случаев это эквивалент(uintptr_t)&typeid(T)
. - person rustyx   schedule 16.03.2021