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

Is it possible to determinate at run time is pointer points to C++ class or at Objective-C class?

本文关键字:C++ 类或 Objective-C 指针 定指 运行时 是否      更新时间:2023-10-16

问题在主题中。

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

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等中可用,但它很容易实现。

Objective-C指针与C++指针相同:4到8个字的整数值,指向内存中的各种对象。Objective-C编译器支持以多种格式输出值,如C、C++和Objective-C对象布局。

就是这样。除此之外真的没有什么了。

你可以尝试做一些技巧性的事情,比如创建一个类,其中字段总是包含一个神奇的值:

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();
}

但要预先警告,这是极其的黑客行为。