2012-05-01 2 views
2

파이썬에서, 다음과 같을 것이다라는 함수 getattr있다 이 C++ (비주얼 C++이 아님)?C++ 상응하는 getattr

내가 문자열을 사용하여 객체의 멤버 변수를 조회 할 수 있습니다이 기능을 가지고있는 라이브러리가 있습니까?

은 내가 변경할 수 없습니다 C++ 클래스의 공용 데이터 멤버를 검색 할 수있는 방법을 찾기 위해 노력하고있다. 그래서지도를 사용하여 문자열 리터럴을 값에 매핑 할 수 없습니다. 매크로가있는 'unstringify'와 같을 수 있습니까?

+0

여기를 참조하십시오 : http://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-ac-application –

+2

글쎄, 당신은 C/C++을 작성하고 파이썬 VM에 반대하여 파이썬을 만들 수 있습니다. 개체 :) (그냥 농담이야! 농담이야!) –

답변

9

당신이 일반적으로 으로 반성라고 요구하고있다.

C++ 언어는 자체적으로 내성 검사를 지원하지 않습니다. 당신은 그것을 에뮬레이션 할 수 있지만, 그 정도입니다.

당신이 제안한다 API의 또 다른 문제도있다 : 당신이 당신의 메서드의 반환 형식을 공식화 할 방법은? 거기에 입니다. boost::any 클래스를 저장하는 데 적합한 클래스이지만 어쨌든 형식을 모르는 경우에는 유용하지 않을 수 있습니다.

+0

예, 내성, 그것이 내가 찾고있는 것입니다. 유형에 관한 한, 모든 데이터 멤버가 int 또는 double 값이므로 걱정하지 않아도됩니다. 고맙습니다! – ulu5

0

아쉽게도 내가 아는 바가 없습니다. 현재의 컴파일러는이 같은

+0

음, 디버그 기호를 사용하지 않는 한. :) – dschultz

+0

동의하지만, 이것이 구현 될지는 의문입니다. –

3

아무것도 표준 C++에 존재하지 않는 반사 이런 종류의 위해 요구되는 메타 데이터의 어떤 종류를 저장하지 않기 때문 컴파일러에서 특별한 지원을 필요로한다. 구조체 또는 클래스가 실제로 어떻게 작동하는지 생각해

struct MyStruct { 
    int a; 
    int b; 
}; 

int의 크기는 32 비트, MyStructb의 다음 위치 4 바이트 떨어진 a의 위치에서 항상라고 가정. 그 오프셋은입니다 컴파일러에 의해 사전에 처리됩니다. C가 구성원 데이터에 액세스하는 데 너무 빠르기 때문에 런타임 조회가 없습니다! 내가 런타임에 "b"를 조회하기를 원한다면

그래서, 그 구조체의 어디에 찾아야 할 것입니다. 그리고 그렇게하기 위해, 컴파일러는 오프셋 테이블을 생성하여 코드의 어딘가에 저장해야합니다. 숨겨진 비 효율성이없는 언어에 대한 오버 헤드가 많습니다.