是否有可能在运行时确定指针指向C ++类或Objective-C类?

时间:2012-03-08 05:10:19

标签: c++ objective-c pointers objective-c++ delete-operator

问题是主题。

我想写一些通用模板函数来安全删除对象,并想知道是否可以使用这样的东西:

template< class T > void SafeDelete( T*& pVal )
{
    if(objc_is_cpp_object(pVal)){
        delete pVal;
        pVal = NULL;
    }
    else
        [pVal release]
}

2 个答案:

答案 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。