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

and*_*y.s 5 c++ pointers objective-c objective-c++ delete-operator

问题是主题.

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

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

iam*_*ind 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];
  }   
}
Run Code Online (Sandbox Code Playgroud)

可能is_pod在 C++11、boost 等中可用。但它很容易实现。