Уникальный идентификатор типа класса, который является безопасным и поддерживается за пределами библиотеки

В современном C++ (03 - при условии, что вы используете последний компилятор, такой как gcc), вы можете использовать ключевое слово typeid, чтобы получить объект type_info, который предоставляет базовую информацию о типе, по крайней мере, во время выполнения - это стандарт (а затем кроссплатформенная) функция.

Я взял пример из Википедии c++ и добавил проверку шаблона cpp / наследования, похоже, он template работает хорошо, но я не cpp уверен в версии int (это cpp взлом, использующий предположение, что classes компилятор будет иметь имена c++ типов где-то в область памяти uniqueness только для чтения ... это templates может быть неправильным предположением).

Строковый c++ идентификатор кажется намного c++ лучше для межплатформенной cpp идентификации, если вы можете templates использовать его в своем cxx случае. Он несовместим с classes кросс-компилятором, так как class имя, которое он дает, «реализация, определенная» стандартом, как template предлагается в комментариях.

Полный cxx код тестового приложения:

#include 
#include   //for 'typeid' to work

class Person 
{
public:
   // ... Person members ...
   virtual ~Person() {}
};

class Employee : public Person 
{
   // ... Employee members ...
};

template< typename DERIVED >
class Test
{
public:
    static int s_id()
    {
        // return id unique for DERIVED
        // NOT SURE IT WILL BE REALLY UNIQUE FOR EACH CLASS!!
        static const int id = reinterpret_cast(typeid( DERIVED ).name());
        return id;
    }

    static const char* s_name()
    {
        // return id unique for DERIVED
        // ALWAYS VALID BUT STRING, NOT INT - BUT VALID AND CROSS-PLATFORM/CROSS-VERSION COMPATBLE
        // AS FAR AS YOU KEEP THE CLASS NAME
        return typeid( DERIVED ).name();
    }
};

int wmain () 
{
    Person person;
    Employee employee;
    Person *ptr = &employee;



    std::cout << typeid(person).name() << std::endl;   // Person (statically known at compile-time)
    std::cout << typeid(employee).name() << std::endl; // Employee (statically known at compile-time)
    std::cout << typeid(ptr).name() << std::endl;      // Person * (statically known at compile-time)
    std::cout << typeid(*ptr).name() << std::endl;     // Employee (looked up dynamically at run-time
                                                    // because it is the dereference of a pointer to a polymorphic class)

    Test test;
    std::cout << typeid(test).name() << std::endl;    
    std::cout << test.s_id() << std::endl;    
    std::cout << test.s_id() << std::endl;    
    std::cout << test.s_id() << std::endl;    
    std::cout << test.s_name() << std::endl;    

    Test< Person > test_person;
    std::cout << test_person.s_name() << std::endl;    
    std::cout << test_person.s_id() << std::endl;    

    Test< Employee > test_employee;
    std::cout << test_employee.s_name() << std::endl;    
    std::cout << test_employee.s_id() << std::endl;    

    Test< float > test_float;
    std::cout << test_float.s_name() << std::endl;    
    std::cout << test_float.s_id() << std::endl;    


    std::cin.ignore();
    return 0;
}

Выводы:

class Person
class Employee
class Person *
class Employee
class Test
3462688
3462688
3462688
int
class Person
3421584
class Employee
3462504
float
3462872

Это c++ работает как минимум на VC10Beta1 template и VC9, должно работать на cpp GCC. Кстати, чтобы использовать uniqueness typeid (и dynamic_cast), вы classes должны разрешить информацию templates о типах времени выполнения classes в вашем компиляторе. По умолчанию uniqueness он должен быть включен. На template некоторых платформах / компиляторах template (я думаю о некоторых встроенных template аппаратных средствах) RTTI unique не включен, потому что это cxx требует затрат, поэтому в class некоторых крайних случаях class вам придется найти лучшее c++ решение.

c++

class

templates

unique

2022-10-02T00:19:40+00:00
Вопросы с похожей тематикой, как у вопроса:

Уникальный идентификатор типа класса, который является безопасным и поддерживается за пределами библиотеки