Статические члены шаблонных функций

В настоящее время я работаю над системой компонент-сущность, в которой мне нужно создавать уникальные идентификаторы для разных типов компонентов, желательно без хранения каких-либо дополнительных данных в классе компонентов (поскольку для этого потребуются статические виртуальные методы, которые не работают, и поэтому мне нужно будет создавать экземпляр нового компонента каждый раз, когда я что-то сравниваю). Подход, к которому я пришел, заключался в создании шаблонного метода:

/*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;
}

Используя это, я могу создавать уникальные статические идентификаторы для каждой производной компонента, которые я использую, без необходимости хранить данные в самом классе как виртуальную функцию (которая не может быть статической, поэтому каждый раз, когда требуется сравнение, потребуется новый экземпляр)

Есть ли какие-либо основные проблемы при использовании такой системы, кроме очевидной дополнительной памяти, используемой членами статического метода?

-Благодарность


person Its Me    schedule 16.03.2021    source источник
comment
если вас устраивает локальная статическая переменная функции, вы также можете использовать нестатический виртуальный метод с локальным статическим идентификатором.   -  person 463035818_is_not_a_number    schedule 16.03.2021
comment
Проблема в том, что я хотел бы получить доступ к своим идентификаторам компонентов, указав тип компонента в методе и вернув его. Хотя такой статический метод мог бы работать, на самом деле он не будет применяться в производных классах, кроме того, для этого потребуется больше кода для каждого компонента, в то время как для этого требуется только два метода.   -  person Its Me    schedule 16.03.2021
comment
Ваше решение должно быть потокобезопасным? В противном случае static локальные переменные являются излишними, поскольку они всегда защищены флагом мьютекса / атомарности. Подробнее см. здесь.   -  person rustyx    schedule 16.03.2021
comment
Нет, на данный момент мне не нужно, чтобы он был потокобезопасным. Проблема в том, что до сих пор это единственный способ, который я мог придумать, чтобы получить доступ к идентификаторам компонентов статически через имя типа и чтобы они оставались постоянными между всеми классами после их создания.   -  person Its Me    schedule 16.03.2021
comment
Вы можете использовать std::type_index(typeid(T)), если вам нужен уникальный идентификатор типа, это не должно вызывать дополнительных затрат времени выполнения. В большинстве случаев это эквивалент (uintptr_t)&typeid(T).   -  person rustyx    schedule 16.03.2021
comment
Спасибо, это определенно более чистое решение, чем то, что было у меня раньше   -  person Its Me    schedule 16.03.2021