2011-09-14 4 views
1

CTypeRef을 특정 CoreFoundation 유형으로 변환하는 간단한 방법이 있습니까? (CFStringRef)myObjectRef 인라인으로 캐스팅하고 싶지는 않지만 모든 CoreFoundation 유형에 대해이 작업을 수행하는 도우미 메서드를 만들고 싶습니다.기본 CFTypeRef를보다 구체적인 CoreFoundation 유형으로 변환

CFGetTypeID(myObjectRef) == CFStringGetTypeID()과 같은 것을 사용하면 CTypeRefCFString인지 여부를 알 수 있습니다. 그러나 이것을 수행하는 단일 메소드를 작성하는 것은 매우 장황 해지고 if 문이 많이 발생할 수 있습니다.

유일한 방법은 CFGetTypeID()에 대한 if 문을 많이 사용하는 방법을 구축하고 있습니까? 아니면 이것을 할 수있는 더 간단한 방법이 있습니까?

UPDATE : 예

내가 바꿀 수없는 레거시 코드로 작업하는 도우미 기능을하고 싶습니다

. 현재 CFDictionaryRef, CFStringRef 또는 CFURLRef 중 하나를 반환 값으로 제공하며 CTypeRef으로 제공됩니다. 현재이 문제를 해결하기 위해 반환 값에 CFGetTypeID()을 실행하고 있지만 이상적이지 않습니다. 대신에 C 스타일의 캐스트를 사용하는 대신에 이것을 처리하는 도우미 CastToCF()을 갖고 싶습니다. 이렇게하면 미래에도 테스트를 쉽게 수행 할 수 있습니다.

P. 나는 가변 유형에 대해 걱정하지 않는다.

답변

1

이 작업을 수행 할 때 명백한 점은 없습니다. C 스타일의 캐스트는 다른 언어와 같지 않습니다. 왼쪽에있는 주소가 오른쪽에있는 주소와 동일하게되는 유형 변환입니다. 다른 언어와 달리 나쁜 캐스트를하면 cftypes가 null을 반환하거나 throw하지 않습니다. 이건 단지 형식을 지정하기위한 장식 일 뿐이며, C 컴파일러는 캐스트가 유효하다고 가정합니다.

또는 도움이되지 않는 경우 사용 방법에 대한 더 나은 예를 제공 할 수 있습니다.

업데이트

확인. 당신이 그것을 objC++ 태그 이후, 난 그냥 진단을 많이했고, 한 도우미 클래스를 만들 것 모든 잡음 변환 (최소 그림) :

class t_helper { 
public: 
    t_helper(CFTypeRef cf) : d_cf(cf), d_type(CFGetTypeID(cf)) { assert(this->d_cf); } 
    ~t_helper() {} 

    /* type info */ 
    bool isString() const { return CFStringGetTypeID() == this->type(); } 
    CFStringRef string() { assert(this->isString()); return this->cf_cast<CFStringRef>(); } 

    bool isDictionary() const { return CFDictionaryGetTypeID() == this->type(); } 
    CFDictionaryRef dictionary() { assert(this->isDictionary()); return this->cf_cast<CFDictionaryRef>(); } 

... 

    /* and a trivial example of an operation */ 
    void appendMutableCopyToArray(CFMutableArrayRef array) { 
     if (this->isString()) { 
      CFMutableStringRef cp(CFStringCreateMutableCopy(0,0,this->string())); 
      CFArrayAppendValue(array, cp); 
      CFRelease(cp); 
     } 
     ... 
    } 

... 

private: 
    template < typename T > T cf_cast() { return reinterpret_cast<T>(this->d_cf); } 
    const CFTypeID type() const { return this->d_type; } 
private: 
    CFTypeRef d_cf; 
    const CFTypeID d_type; 
}; 

내가 정말 특정하지 않고 얻을 얻을 수에 대한 정확한입니다 당신이 다루고있는 프로그램의 예.

+0

도움이 될만한 예제가 추가되었습니다. – KushalP

+0

@KushalP 업데이트 됨 – justin

관련 문제