c++ - 是否可以在运行时确定指针指向 C++ 类还是指向 Objective-C 类?

标签 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]
}

最佳答案

如评论中所述,我建议不要混合使用 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、boost 等中可用。但它很容易实现。

关于c++ - 是否可以在运行时确定指针指向 C++ 类还是指向 Objective-C 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9613192/

相关文章:

c - free() 函数的使用

c++ - 有没有办法访问 STL 容器适配器的底层容器?

objective-c - Objective-C : Memory Allocation on stack vs. 堆

ios - 将 webView 放入 scrollView 时手势冲突

c - 格式说明符 int * 警告消息

c - 指针未设置为结构数组的元素

c++ - 列表迭代器 Remove()

c++ - std::vector push_back 在并行 for 循环中使用时失败

c++ - 将clamp()添加到片段着色器时,OpenGL GLSL在标记 "::"处期望 "<int-const>"

objective-c - 使用xcode GPU捕获的 Metal 中的一些参数是什么意思?