2013-06-24 1 views
0

이전 질문을 삭제하고 여기에서 질문을 다시 정리하십시오. 대신 템플릿을 사용하여 다음 기능을 수행 할 수 있습니까?MACRO를 사용하지 않고 멤버 변수에 액세스하는 방법

#include <iostream> 

using namespace std; 

#define FUNC(T1, T2) do {cout<< T1.T2<<endl; } while(0); 

struct ST{ 
    double t1; 
    int t2; 
    double t3; 
}; 

struct ST2{ 
    int t1; 
    double h2; 
}; 


int main() 
{ 
    ST st; 
    ST2 st2; 
    st.t1 = 1.1; 
    st.t2 = 0; 
    st.t3 = 3.3; 
    FUNC(st, t1); 
    FUNC(st, t2); 
    FUNC(st, t3); 
    FUNC(st2, h2); 
} 
+0

왜 매크로를 사용합니까? –

답변

3

정확한 구문으로는 아무 것도 할 수 없다고 생각합니다. 그래서 당신의 코드는 정의되지 않은 동작을 보여, st2.h2이 예에서 초기화되지 않은 것을

print(st, &ST::t1); 
print(st, &ST::t2); 
print(st2, &ST2::h2); 

참고 :

template <typename T, typename Q> 
void print(T& var, Q T::* mem) 
{ 
    cout << var.*mem << endl; 
} 

사용 :하지만 당신은 멤버 포인터와 함수 템플릿과 긴밀한 뭔가를 얻을 수 있습니다.

+0

본래의 의도는 특정 멤버 변수의 주소와 유형을 가져 와서 다른 클래스를 만들어서 (전체 클래스가 아닌) 변수를 관찰하고 업데이트 할 수 있도록하는 것입니다. –

+0

그런데 포인터를 멤버로 정렬하면됩니다. 포인터와 클래스의 인스턴스에 대한 참조 형식을 저장할 수 있습니다. 나는 당신이하려고하는 것을 정말로 이해하지 못하기 때문에 더 구체적으로 표현하기가 어렵습니다. – Mat

+0

답장을 보내 주셔서 감사합니다. 나는 너의 대답을 잘 지낼 수 있다고 생각한다. 나는 그것을 게시했을 때 가장 간단한 질문으로 나의 질문을 종결하고 싶다. 그러나 또한 사람들을 쉽게 오도합니다. –

4

짧은 대답 : 아니요. 왜 그렇게하고 싶습니까? 무엇이 그렇게 특별한가 ( 클래스 변수 , 회원 ) 표기법에 대한 특별한가요? 분명히 st, t1 대신 st.t1을 사용하는 함수를 작성할 수 있습니다. 왜 그 것을 피하려고합니까?

긴 대답 : 유용하지 않습니다. t1은 현재 FUNC(st, t1)이라고하는 지점에 있지 않습니다. 현재 매크로는 현재 범위에서 찾을 수있는 st.t1으로 바꿉니다. 실제로 이라면 실제로 뭔가를 해킹하고 싶었을 때 t1, t2, t3, h2 등의 개체를 범위에 넣어야 함수에 전달할 수 있고 어떤 필드를 액세스해야하는지 인코딩 할 수 있습니다. 로컬 t1 등을 멤버 변수에 대한 포인터로 사용하는 것이 확실한 선택입니다. 이는 매우 불편하고, 길고, 오류가 발생하기 쉽지만 :이 간접적 인 지시를 지원하기 위해 모든 여분의 변수를 설정해야합니다.

+0

죄송합니다. 내보기가 지나치게 단순화되었을 수 있습니다. 나의 원래 의도는 특정 멤버 변수의 주소와 타입을 가져 와서 변수를 관찰하고 업데이트하는 또 다른 클래스를 만들 수있다. (전체 클래스가 아님) –

+1

그러면 Mat의 일러스트레이션 기술이 도움이 될 것이다. 내부적으로 저장할 수있다. 적절한 펑터를 만들거나 관찰/업데이트 코드 내에서 다형성으로 파견 할 수있는 적합한 유형별 템플릿 인스턴스를 만듭니다. –

+0

도움을 주셔서 감사합니다. 나는 단지 나의 질문을 단순화하려고 노력한다. 그러나 나는 나의 의도를 명백하게하지 않았다. –

관련 문제