问题是主题。
我想写一些通用模板函数来安全删除对象,并想知道是否可以使用这样的东西:
template< class T > void SafeDelete( T*& pVal )
{
if(objc_is_cpp_object(pVal)){
delete pVal;
pVal = NULL;
}
else
[pVal release]
}
答案 0 :(得分:4)
正如评论中所述,我建议不要混用C ++ delete
和Objective-C release
。
仅从技术角度来看,您可以使用以下SFINAE技巧运行时:
template<typename T> struct void_ { typedef void type; };
template<typename, typename = void>
struct CppType { static const bool value = false; };
template<typename T>
struct CppType<T, typename void_<int (T::*)>::type> { static const bool value = true; };
template< class T >
void SafeDelete( T*& pVal )
{
if(CppType<T>::value || std::is_pod<T>::value) { // <-----
delete pVal;
pVal = 0;
}
else {
// [pVal release];
}
}
可能,is_pod
可用于C ++ 11,提升等。但它很容易实现。
答案 1 :(得分:2)
Objective-C指针与C ++指针相同:4到8个字的整数值,指向内存中的各种对象。 Objective-C编译器支持使用多种格式输出值,例如C,C ++和Objective-C对象布局。
就是这样。除此之外真的没有多少。
你可以尝试做一些hacky,比如创建一个字段总是包含一个魔术值的类:
template <class T>
class Magic {
private:
const char magic[] = 1234567;
public:
bool is_object() const {
return magic == 1234567;
}
}
然后你可以这样测试它:
bool is_cpp(void *ptr) {
return ((Magic*) ptr)->is_object();
}
但请注意,这是非常 hacky。