2016-09-30 3 views
1

저는 튜플과 같은 데이터 구조로 실험 해 왔습니다. 각 유형의 오브젝트 중 하나만 포함하고 각 오브젝트는 C 스타일의 PODS 여야합니다. 이 클래스는 보유한 객체에 액세스하는 기괴한 방법을 사용하며,이 클래스는 파생 클래스의 참조를 반환합니다. 마찬가지로 :부모 클래스에 대한 참조 반환 C++

template<class... Ts> 
class Container : private Ts... 
{ 
public: 
    template<class T> 
    T& get_component() 
    { //returns reference to base class specified by T 
     return static_cast<T&>(* const_cast<Container<Ts...> *>(this)); 
    } 
}; 

그리고 의도는 다음과 같이 사용합니다 : 그것은 &를 T로 static_casts보다 내가 사용하는

struct A { int x, y; }; 
struct B { float x, y; }; 

int main() 
{ 
    using namespace std; 

    Container<A, B> foo; 
    A& a_ref = foo.get_component<A>(); 

    a_ref.x = 5; 
    a_ref.y = 10; 

    const B& b_ref = foo.get_component<B>(); 

    cout << b_ref.x << endl; 
    cout << b_ref.y << endl; 
} 

방법은 다음 역 참조,이에 const_cast한다. 내가 사용하고있는 기술에 함정이 있습니까? 테스트에서 나는이 디자인을 예상대로 수행하는 것 같았습니다.

편집 : const_cast는 중복됩니다. 이 포인터에 대한 참조를 할당하는 것에 대한 오해가있었습니다. 난 그냥 static_casting T & dereferenced해야합니다.

+1

왜 처음에는'const_cast'를 사용하고 있습니까? 당신은 단지 같은 유형으로 캐스팅하는 것입니다. – 0x499602D2

+0

'const'를 추가하려면'static_cast'를 사용할 수 있습니다. – krzaq

+1

@krzaq 아니면 반환 유형을'const T &'로 변경하고'const' 함수도 만드십시오 – user4407569

답변

1

은 지금까지 내가이 말할 수있는 단지 단순화 될 수있다 : 당신은 그들이 개인 기본 클래스 왜 내가 의문을 제기하고있는 구성 요소를 검색 할 수있는 경우

template<class... Ts> 
class Container : private Ts... 
{ 
public: 
    template<class T> 
    T& get_component() 
    { 
     return *this; 
    } 

    template<class T> 
    const T& get_component() const 
    { 
     return *this; 
    } 
}; 

. 코드와

한 가지 문제는 다수의 동일한 기본 형태의 발행 수, 예컨대 : 오류를 범

struct A {}; 
struct B : A {}; 

Container<A,B> container; 
auto& a_ref = container.get_component<A>(); 

이다. get_component이 즉각적인 기반에서만 작동하도록 허용하는 개인 기지 대신 사설 데이터 회원을 사용함으로써 이와 같은 것을 피할 수 있습니다.

+0

이유 중 하나는 모호성을 해결하는 것입니다. A와 B 모두 구성원 x를 가지고 있기 때문에 foo.x는 모호합니다. – Brian

+0

@Brian : 공공 기지를 사용했다면 간단히'A & a_ref = foo; '를 사용할 수 있고'get_component'는 불필요합니다. – user4407569