2. 대체 Reflection이 뭐임?
RTTR은 어떻게 쓰냐 보다는
reflection이 뭔지, 어디에 쓰는 건지가 중요.
현재 c++ 자체에는 없는 개념이며,
c#, 자바에서는 이미 기본으로 제공하는 기능.
3. In wiki
컴퓨터 과학에서, 반영(Reflection)은 컴퓨터 프로그램에서 런타임 시점에 사용되는 자신의 구조와 행
위를 관리(type introspection)하고 수정할 수 있는 프로세스를 의미한다.
“type introspection”은 객체 지향 프로그램언어에서 런타임에 객체의 형(type)을 결정할 수 있는 능력
을 의미한다.
4. Reflextion
정의된 클래스, 구조체, enum등을
1. 동적으로 로드
2. 속성들(멤버 함수, 멤버 변수 등)의 목록 반환
3. 속성에 접근 또는 호출
개발툴 제작이나 디컴파일 프로그램에 쓴다고 함.
제너릭 프로그래밍에도 쓰일 듯
가독성이 상당히 떨어지고, 컴파일 시에 타입체
킹을 하지 않기 때문에 많이 쓰면 성능문제가 발
생한다고 함.
출처: 워킹레벨 자바7 실무 바이블:
고급 프로그래머가 알아야 할 프로
젝트 자바
5. 설치 방법
http://www.rttr.org/download의 다음 binaries중에 원하는것을 다운받는다.
압축을 풀면 다음 폴더들이 있다.
동적 라이브러리 형태이며, bin에 dll이 있다. 이 폴더들을 visual studi에 경로 설정을 해주면 된다.
동적 라이브러리 등록 방법: http://transparentworld.tistory.com/53
6.
7. 객체 등록
//객체 선언
#include <rttr/registration>
using namespace rttr;
struct MyStruct {
MyStruct() {};
void func(double) {};
int data;
};
RTTR_REGISTRATION {
registration::class_<MyStruct>("MyStruct")
.constructor<>()
.property("data", &MyStruct::data)
.method("func", &MyStruct::func);
}
//멤버변수 등록
//멤버함수 등록
//생성자 등록(현재 기본형이므로 그냥 둠)
8. 멤버 iteration
type t = type::get<MyStruct>(); // type객체로 클래스 정보를 받음
for (auto& prop : t.get_properties()) //get_properties로 멤버변수 벡터를 받음
std::cout << "name: " << prop.get_name() << std::endl;
for (auto& meth : t.get_methods()) // get_methods로 멤버변수 벡터를 받음
std::cout << "name: " << meth.get_name() << std::endl;
9. 객체 생성 방법
객체 생성 방식에는 다음 두가지가 있으며,
빨간색 부분에서 제너릭 프로그래밍적인 요소가 보인다.
1. create()를 이용.
Type t = type::get_by_name("MyStruct"); //객체 타입을 받음
Variant var = t.create(); //create함수로 객체 생성.
std::cout << var.get_type().get_name(); // prints 'MyStruct'
2. Invoke 이용.
constructor ctor = t.get_constructor(); //constructor 변수에 객체 생성자를 받음
Variant var = ctor.invoke(); //invoke 함수로 생성자를 호출해 객체 생성.
std::cout << var.get_type().get_name(); // prints 'MyStruct'
10. 멤버변수 get, set
MyStruct obj; //객체 생성
Property prop = type::get(obj).get_property(“data”); //obj의 data 멤버변수를 get.
prop.set_value(obj, 23); //멤버변수의 값을 23으로 set
variant var_prop = prop.get_value(obj); //멤버변수 값 가져오기.
Std::cout << var_prop.to_int(); // prints '23‘ //int로 반환
//property는 클래스 자체의 멤버변수 타입에 대한 정보를 가지고 있는듯.
//그래서 어느 객체의(obj) 멤버변수 값을 바꿀지를 지정해야한다.
11. 함수 호출
MyStruct obj; //객체 생성
method meth = type::get(obj).get_method("func"); //method변수에 함수 받기
meth.invoke(obj, 42.0); //매개변수를 42.0으로 함수 호출.