2013-03-15 4 views
2

동일한 데이터 레이아웃을 가진 두 클래스 A와 B (즉, 멤버가 아닌 함수 만 다른 경우)를 통해 암시 적으로 변환 할 수있는 참조 유형을 어떻게 만들 수 있습니까?참조 유형 간의 암시 적 변환

struct Storage 
{ 
    uint32_t a, b; 
}; 


class First : private Storage 
{ 
    int32_t GetA() { return a; } 
    int32_t GetB() { return b; } 
}; 

class Second : private Storage 
{ 
    int64_t GetA() { return a; } 
    int64_t GetB() { return b; } 
}; 


void FuncF(const First& first); 
void FuncS(const Second& second);  

// I would like to be able to call like 
int main() 
{ 
    First f; 
    Second s; 

    FuncF(s);   // Conversion fails 
    FuncS(f);   // Conversion fails 

    return 0; 
} 

난 내가 한 방향으로 작업 전환을 얻을 수 있습니다 class First : Second처럼 상속을 사용 또한 경우, 패스 별 사본을 작업 위를 얻을 수 있습니다.

(위의 예제는 고의적 인 예제이므로 int32_t 및 int64_t 반환 유형이 uint32_t에서 생성 될 수있는 더 복잡한 클래스라고 생각할 수 있습니다.)

분명히 말하자면 나는 데이터가 동일하다는 사실에 의거하여 First 개체를 Second 참조로 바인딩하거나 그 반대로도 바인딩 할 수 있기를 바랍니다.() 둘째 : 연산자 우선;

FuncS(static_cast<Second&>(f)); // This works, is it standard (ie portable) 
            // and can I define the class so the cast is not necessary? 
+3

상속을 공개 할 수 있습니다. 그러면 두 유형의 값을 기준에 대한 참조로 바인딩 할 수 있습니다. –

답변

1

당신은 Type Conversion Operator

그래서 두 번째 양식의 멤버 함수가 필요합니다 사용할 수 있습니다 마찬가지로 First에서도 마찬가지입니다. 이렇게하면 형식 변환 할 필요없이 암시 적 변환이 수행됩니다.