将基本CFTypeRef转换为更具体的CoreFoundation类型

时间:2011-09-14 11:01:02

标签: objective-c objective-c++ core-foundation

有没有一种简单的方法可以将CTypeRef转换为特定的CoreFoundation类型?我不打算将内联转换为(CFStringRef)myObjectRef,但是想为所有CoreFoundation类型创建一个帮助方法来执行此操作。

我知道可以使用类似CFGetTypeID(myObjectRef) == CFStringGetTypeID()的内容来确定CTypeRef是否为CFString。但是,创建一个方法来执行此操作可能会变得非常冗长并且有很多if语句。

CFGetTypeID()唯一的方法构建一个带有一堆if语句的方法吗?或者有更简单的方法吗?

更新:,带示例

我想创建一个帮助函数来处理一些我无法改变的遗留代码。目前,它会生成CFDictionaryRefCFStringRefCFURLRef中的一个作为CTypeRef提供的返回值。我目前正在通过在返回值上运行CFGetTypeID()来解决这个问题,但这并不理想。我宁愿拥有一个CastToCF()帮助器来处理这个问题,而不是让C风格的演员阵容到处都是。这有助于将来更轻松地进行测试。

P.S。我并不担心可变类型。

1 个答案:

答案 0 :(得分:3)

这样做没有明显的意义。 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;
};

如果没有您正在处理的程序的真实具体示例,那就像我能得到的一样准确。