2011-09-14 12 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.S.私は可変型について心配していません。

答えて

1

これを行う際に明らかな点はありません。 Cスタイルのキャストは他の言語と似ていません。左側のアドレスが右側のアドレスと同じになるタイプキャストです。悪いキャストを行った場合、他の言語とは異なり、cftypesはnullを返すことはありません。それは単に型を指定するための装飾にすぎず、Cコンパイラはキャストが有効であるとみなします。

か、これが役に立たなかった場合は、これをどのように使用するかの良い例を提供することができます。

更新

OK。あなたがそれをに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

関連する問題