2011-09-14 51 views
1

有沒有簡單的方法將CTypeRef轉換爲特定的CoreFoundation類型?我不想將內聯投影爲(CFStringRef)myObjectRef,但希望爲我爲所有CoreFoundation類型創建一個幫助器方法。將基本CFTypeRef投射到更具體的CoreFoundation類型

我知道有可能使用類似CFGetTypeID(myObjectRef) == CFStringGetTypeID()的東西來確定CTypeRef是否爲CFString。然而,創建一個單一的方法來做到這一點可能會變得非常冗長,並且會有很多if語句。

正在用一堆if語句構建一個方法反對CFGetTypeID()的唯一方法?還是有更簡單的方法來做到這一點?

UPDATE:與例如

我想打一個輔助函數的一些遺留代碼,我不能改變工作。目前它產生CFDictionaryRef,CFStringRefCFURLRef之一作爲CTypeRef提供的返回值。我目前通過在返回的值上運行CFGetTypeID()來解決這個問題,但這並不理想。我寧願有一個幫助我處理這個問題的助手,而不是在所有地方都使用C風格。這將有助於未來更輕鬆地進行測試。

P.S.我並不擔心可變類型。

回答

1

這樣做沒有明顯的意義。 c風格轉換不像其他語言 - 它是一個類型轉換,其左側的地址與右側的地址相同。如果你做了不好的演員,cftypes不會拋出或返回null(與其他語言不同)。喵,它只是一個指定類型的裝飾,並且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