2012-02-22 4 views
0

에 대해 컴파일러에서 합성 한 기본 복사 생성자는 자체 정의하지 않는 클래스를 사용합니다. 즉, 모든 개체를 한 개체에서 다른 개체로 복사합니다.C++ 컴파일러에서 기본 복사 생성자를 합성하는 방법

나는 비슷한 것을하고 싶다. 메소드를 작성하고 싶습니다.

template <typename T> 
T f(const T& obj) { 
// for each member var i of obj, I want to call some method g(obj.i) 
} 

이제 멤버 변수의 이름을 알 수 없습니다. 이 경우 복사 생성자 경우 g 대신 할당 연산자를 호출 할 수 있습니다.

분명히 컴파일러가이 작업을 수행합니다 (그러나 클래스의 멤버 이름이 인 것으로 추측 한 후에 가능합니다). 모든 클래스 T에 대해 을 수행 할 수 있습니까?

+0

POD 인 경우 memcpy를 사용하지 않는 이유는 무엇입니까? – marcinj

+0

@luskan : 아이디어는 각 멤버를 복사하는 것이 아니라 각 멤버에서 임의의 함수 'g'를 호출하는 것입니다. –

+1

아니요, 불행히도 자신을 정의 할 때 기본 복사 생성자의 기능을 되 찾을 수 없습니다. –

답변

5

컴파일러에는 각 클래스를 나타내는 내부 데이터 구조가 있습니다. 복사 생성자를 합성 할 때, 생성해야하는 코드 (얼마나 많은 복사본이 있는지, 각 복사본이 어떻게 수행되었는지, 그리고 소스 코드와 관련하여 멤버의 주소가 무엇인지 알아 내기 위해이 구조를 참조 할 수 있습니다 및 목적지 객체 주소).

단순한 C++ 프로그래머로서이 내부 컴파일 시간 데이터 구조에 액세스 할 수 없으므로 운이 좋지 않습니다. 당신은 기본적으로 회원들을 나열해야하고, 당신이 어떤 것을 남겨 두지 않기를 희망합니다.

당신은 아마도 전처리 작업을 할 수있는 (또는 다음하지 전처리 전처리 경우), 각 구성원에 대해 하나의 호출의 목록을 생성하는 데 사용할 수있는 추가 정보로 구조체 정의를 주석.

0

아니요,이 작업을 수행 할 수 없습니다. C++에는 method reflection이 없지만 Qt와 같은 프레임 워크 내에서 작업하면이 작업을 수행 할 수 있습니다. (어떤 프레임 워크가 훌륭한 프레임 워크인지, 나는 항상 그것을 사용하고 C++ 위에 얇은 종이 레이어 만 제공합니다.) 컴파일러는 이것을 할 필요가 없습니다. 즉, 필요하지 않습니다. 회원의 이름을 유추하십시오. 그것은 단지 객체의 주소와 각 멤버의 타입으로부터의 메모리 오프셋을 알고 있고 생성자를 호출하여 그것들을 목표 객체에 복사합니다.