2017-03-09 1 views
1

참조 변수가 일반 변수 대신 클래스 멤버를 참조하는지 (그리고 그 클래스가 속한 클래스를 결정하는지) 확인할 수있는 방법이 있습니까? 여기에 희망 난에 얻고 무엇을 보여주고있는 간단한 예제 :C++ : 클래스 멤버에 대한 참조와 일반 변수에 대한 참조를 구별하는 방법은 무엇입니까?

class A 
{ 
    private: 
     unsigned int x; 

    public: 
     A() : x(15) { } 
     unsigned int& GetX() { return x; } 
}; 

int main(void) 
{ 
    A a; 
    unsigned int y = 12; 
    unsigned int& yr = y; 
    unsigned int& xr = a.GetX(); 

    // Is there anyway of identifying, using typeid() or something 
    // similar, whether xr refers to x inside class A or is its type 
    // completely indistinguishable from that of yr? i.e. does its type 
    // information contain anything along the lines of  
    // typeid(xr).name() == "A::unsigned int&" that identifies it as 
    // belonging to class A? 

    return 0; 
} 

편집 :

아니, 이렇게 구별 할 수있는 방법이 없습니다. 왜 그러고 싶니? 의심스럽게 XY 문제를 좋아합니다. 소리가납니다.

확인, 아마 내 예는 너무 단순했고 어쩌면 내가 질문 그래서 내가 당신에게 더 상세한 예를 제공 할 수있는 권리 요구하고 있지 않다 :

위의 클래스 A를 고려합니다. 대부분의 경우 getter 메서드를 사용하여 x 값을 쿼리하여 상수 참조를 반환하는 것이 일반적으로 필요합니다 (실제 코드 x는 실제로 매우 큰 벡터 또는 행렬이므로 값으로 반환하는 속도가 느릴 수 있음) . 그러나 특수한 경우에 x의 값을 변경할 수 있기를 원할 수도 있습니다. 즉, 이전 질문에 따라 함수 래퍼에 바인드 된 사용자 지정 함수의 내부에서 변경할 수 있습니다. C++: Generic function wrapper class as a member of a non-template class. 따라서 함수를 함수 래퍼에 바인딩 할 때 getter 메서드와 helper 클래스를 사용하여 사용자 함수에 의해 수정 될 인수가 제공되어 const 한정자를 제거합니다.

A.BindFunc(UserFunc, WriteAccess::GetNonConstRef(A.GetX())); 

WriteAccess 헬퍼 클래스는 다음과 같다 여기서

class WriteAccess 
{ 
    public: 

     template <typename T> 
     static T& GetNonConstRef(const T& x) 
     { 
      return const_cast<T&>(x); 
     } 
}; 

그리고 사용자의 함수는 다음과 같을 수 있습니다

void UserFunc(unsigned int& X) 
{ 
    X = somethingelse; 
} 

그러나, 나는되는 것을 WriteAccess::GetNonConstRef() 방법을 방지하기 위해 싶습니다 모든 이전 클래스 멤버와 함께 사용되며 클래스 A (및 파생 클래스)의 멤버와 함께 만 사용할 수 있습니다. 그래서 어쨌든 결정하는 경우 WriteAccess::GetNonConstRef() 안에 제공된 참조 클래스가 속해 있으므로 다른 클래스가 사용되면 컴파일되지 않거나 실행이 종료됩니다.

일반적인 변수에 대한 참조와 클래스 멤버에 대한 참조 (실제로 클래스 A의 멤버에 대한 참조 및 다른 클래스의 멤버에 대한 참조)를 구별 할 수있는 방법이 있다면 생각해 봅니다. 그러면 이것이 도움이 될 것입니다.

+6

아니하므로 구별 할 방법은 없다. 왜 그러고 싶니? [XY 문제] (http://xyproblem.info/)와 같은 의심스러운 소리입니다. –

+0

'int & A :: GetX()'를 추가하는 것이 더 간단 해 보입니다 ... – Jarod42

+0

BTW,'const int & ref = cond? y : a.GetX();' – Jarod42

답변

3

클래스 멤버에 대한 참조와 일반 변수에 대한 참조를 구별하는 방법은 무엇입니까?

일반적으로 이것은 불가능합니다. 참조는 객체 컨테이너의 정보를 보유하지 않습니다. 하위 오브젝트는 독립형 오브젝트와 구별 할 수 없습니다.

typeid은 도움이되지 않습니다. 변수의 완전한 이름은 변수의 유형 이름의 일부가 아닙니다.


그러나, 참조 (또는 포인터)가 특정 컨테이너 인스턴스의 특정 멤버를 의미하는지 여부를 테스트 할 수있다 :

bool xr_refers_to_x_of_a = &xr == &a.GetX(); // true 
관련 문제