有没有一种简单的方法可以将CTypeRef
转换为特定的CoreFoundation类型?我不打算将内联转换为(CFStringRef)myObjectRef
,但是想为所有CoreFoundation类型创建一个帮助方法来执行此操作。
我知道可以使用类似CFGetTypeID(myObjectRef) == CFStringGetTypeID()
的内容来确定CTypeRef
是否为CFString
。但是,创建一个方法来执行此操作可能会变得非常冗长并且有很多if语句。
用CFGetTypeID()
唯一的方法构建一个带有一堆if语句的方法吗?或者有更简单的方法吗?
更新:,带示例
我想创建一个帮助函数来处理一些我无法改变的遗留代码。目前,它会生成CFDictionaryRef
,CFStringRef
或CFURLRef
中的一个作为CTypeRef
提供的返回值。我目前正在通过在返回值上运行CFGetTypeID()
来解决这个问题,但这并不理想。我宁愿拥有一个CastToCF()
帮助器来处理这个问题,而不是让C风格的演员阵容到处都是。这有助于将来更轻松地进行测试。
P.S。我并不担心可变类型。
答案 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;
};
如果没有您正在处理的程序的真实具体示例,那就像我能得到的一样准确。