UFO ET IT

프로그래밍 방식으로 C ++ 클래스 이름 검색

ufoet 2021. 1. 10. 17:50
반응형

프로그래밍 방식으로 C ++ 클래스 이름 검색


C ++에서 클래스 이름을 변수 나 게터에 하드 코딩하지 않고도 문자열 형식으로 검색 할 수 있는지 궁금합니다. 해당 정보는 실제로 런타임에 사용되지 않기 때문에 사용할 수 없다는 것을 알고 있지만이 기능을 만들기 위해 만들 수있는 매크로가 있습니까?

편집 : 실제로 파생 클래스의 이름을 검색하려고 시도하고 있으며 Visual C ++ 2008 Express Edition을 사용하고 있다는 점에 유의하면 도움이 될 수 있습니다.


다음을 사용할 수 있습니다 typeid.

#include <typeinfo>
cout << typeid(obj).name() << endl;

그러나 형식이 표준화되지 않았고 다른 컴파일러 (또는 동일한 컴파일러의 다른 버전)간에 다를 수 있으므로 권장하지 않습니다.


특정 클래스인지 확인하고 싶다면

typeid(obj) == typeid(CSubClass)

구현에 관계없이 항상 작동합니다.

그렇지 않으면 편리한 방법은 다음을 선언하는 것입니다.

virtual const char* classname() { return "CMyClass";}

하위 클래스별로 구현합니다.


typeid(obj).name()것은 항상 객체의이 선언되었을 때 변수의 유형이 아닌 실제의 형태 (클래스) 제공합니다. 변수 obj가 obj가 선언 된 클래스의 하위 클래스 인스턴스에 할당되면 typeid는 불행히도이를 나타내지 않습니다.


이건 어때?

Visual Studio 2019 (v142)를 사용하여 Windows 10에서 테스트되었습니다.

#include <iostream>
#include <typeinfo>
#include <string>

/**
 @author    blongho
 @fn        template<typename Object> std::string classNameOf()

 @brief     Determine the class name of an object

 @tparam    Object  Type of the object.

 @returns   A name of the class
 @date      2019-09-06
 */

template<typename Object>
std::string classNameOf() {
    std::string name = typeid(Object).name(); //* user defined types gives "class Type"*\ 
    size_t spacePosition = name.find_first_of(" ");
    if (spacePosition != std::string::npos) {
        return name.substr(spacePosition + 1, name.length());
    }
    return name; // mostly primitive types
}


class Person {
private:
    /* data */
public:
    Person() {};
    ~Person() {};

};

class Data
{
private:
    /* data */
public:
    Data() {};
    ~Data() {};

};

struct Type {};

int main() {
    std::cout << "Class name of Person() is \"" << classNameOf<Person>() << "\"\n";
    std::cout << "Class name of Data() is \"" << classNameOf<Data>() << "\"\n";
    std::cout << "Class name of Data() is \"" << classNameOf<Type>() << "\"\n";
    std::cout << "Class name of double is \"" << classNameOf<double>() << "\"\n";
    std::cout << "Class name of std::string is \"" << classNameOf<std::string>() << "\"\n";
    std::cout << "Class name of int is \"" << classNameOf<int>() << "\"\n";
    std::cout << "Class name of float is \"" << classNameOf<float>() << "\"\n";
    std::cout << "Class name of char is \"" << classNameOf<char>() << "\"\n";
    return 0;
}

Output

Class name of Person() is "Person"
Class name of Data() is "Data"
Class name of Data() is "Type"
Class name of double is "double"
Class name of std::string is "std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >"
Class name of int is "int"
Class name of float is "float"
Class name of char is "char"

Ubuntu 18.04에서

g++ -o test src/main.cpp
./test
Class name of Person() is "6Person"
Class name of Data() is "4Data"
Class name of Data() is "4Type"
Class name of double is "d"
Class name of std::string is "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE"
Class name of int is "i"
Class name of float is "f"
Class name of char is "c"

참조 URL : https://stackoverflow.com/questions/1024648/retrieving-ac-class-name-programmatically

반응형