반응형
프로그래밍 방식으로 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
반응형
'UFO ET IT' 카테고리의 다른 글
열거 확장 방법 (0) | 2021.01.10 |
---|---|
IdentityHashMap의 사용 사례 (0) | 2021.01.10 |
DataView에서 행 반복 (0) | 2021.01.10 |
DataTable의 열만 다른 DataTable에 복사하는 방법은 무엇입니까? (0) | 2021.01.10 |
DEBUG 모드에서 NSLog 활성화 및 비활성화 (0) | 2021.01.10 |