나는 여기에 도전의 대상이있다. 나는 미래의 프로젝트를위한 연습과 유틸리티 킷으로 리플렉션 라이브러리에서 일하고 있습니다. 그것을 작동 시키려면, 나는 방해받지 않는 것이 불가피하다는 것을 이미 받아 들였고 귀중한 반성 데이터를 얻기 위해 클래스의 몸체에 적어도 약간의 코드를 추가해야 할 것입니다.리플렉션 구현 : 클래스의 부모를 찾는 방법
그러나 가능한 한 미니멀리즘을 원합니다. 그래서, 기존의 구현을 연구 한 후에, 저에게 맞는 개념을 발견했습니다. 단순화하기 위해, 패턴은 다음과 같습니다
class Base
{
int baseFoo;
double baseBar[5];
RTTINFO(baseFoo, baseBar);
};
(...)
Base sth;
std::cout << TypeInfo(sth).variables[0].name; << std::endl;
// I don't mind if the way of accessing the type info changes totally
일부 제네릭 프로그래밍을 사용하여, 나는이 RTTINFO
매크로 및 건물 유형의 정보 구조 뒤에 같은 것을 숨기는 꽤 많이 얻을 수 있습니다. 나는 종류, 이름, 배열 크기 등을 검색 할 수 있습니다하지만이처럼, 한 단계를 가서 상속을 소개 할 때 :
class Derived : public Base
{
std::string foo;
char* bar;
/* RTTIPARENT(Base); <-- I want to avoid this */
RTTINFO(foo, bar);
};
나는 자료를 명시 할 방지하고 여전히에 들어갈 수 있기를 원하는 것 그것의 일원의 RTTI. Base
이 RTTINFO(...)
에 Derived
에 대한 힌트를 섞어서 가능할 수 있기를 바랍니다. 그럼 .. 거기 있니?
주요 요구 사항은 다음과 같습니다
- 가 난 아무데도 기본 클래스하지만 언어 정의 위치를 지정하지 않습니다. 그리고 나는 어떤 매크로에서든지
class Derived : public Base
을 감싸고 싶지 않다. RTTIINFO
은 영향을받는 클래스에 필요한 언어 및 메모리 바이어스를 추가 할 수 있습니다.- 내가 원한다면
RTTINFO
매크로에 넣을 수 있습니다. 필요하다면 엄청난 양의 코드도 넣을 수 있습니다. - Base와 Derived 모두 매우 동일한
RTTINFO
매크로를 사용합니다.이 매크로는 물론 추론에서 다시 사용할 수 있습니다. 다중 상속 문제를 버리자, 단일 상속은 충분히 복잡해 보인다. - 이
Base
의 RTTI에 액세스 할 필요는 없습니다. RTTI 데이터를 처리하는 다른 외부 도우미 클래스/함수 일 수도 있습니다. 그러나 개인 멤버 변수를 지원해야합니다. - 저는 컴파일과 런타임 비용에 신경 쓰지 않습니다. 상속 트리 만들기, 모든 기존 클래스 폴링, 런타임에 수행해야하는 모든 계산 등의 계산이있는 경우 항상 프로그램의 초기화 단계로 이동할 수있는 방법이 있습니다. 그래서 나를 위해 큰 문제가되지 않습니다.
- 가능한 경우 언어 지원 RTTI를 사용하지 마십시오. 일부 프로젝트에서는 해제해야합니다. 어쨌든, 나는 그것으로도 해결책을 찾지 못했습니다.
- 추가 컴파일 단계를 추가 할 수 없습니다.
하나의 참고 : 아마 type_info::before()
을 사용할 수 있지만 일반적인 컴파일러에서 작동한다고하더라도 C++ 표준은 여기에서 상속 관계에 의존 할 수 없다고 말합니다.
의견을 보내 주셔서 감사합니다.
앤드류
매크로에서 현재 클래스 이름을 어떻게 구합니까? –
Reflection은 전기 톱이 치과 의사의 진료에 속한만큼 C++ "미래를위한 유틸리티 키트"에 속합니다. –
정확하게, 어떤 종류의 리플렉션/타입 정보를 원한다면 너무 많은 매크로로 끝나지 않아 유용하지 않을 것입니다. G 객체를 보자. – farnoy