是否可以在运行时确定指针指向C++类或Objective-C类
Is it possible to determinate at run time is pointer points to C++ class or at Objective-C class?
问题在主题中。
我想写一些通用的模板函数来安全删除对象,想知道是否可以使用这样的东西:
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();
}
但要预先警告,这是极其的黑客行为。
相关文章:
- 不同的类或结构初始化方法之间的性能差异是什么?
- .h 或.cpp文件中的抽象类或两者兼而有之?
- C++ Visual Studio 错误:名称后跟'::'必须是类或命名空间名称 (DirectX 11)
- 为什么在类或结构中传递自定义比较器函数?
- 创建一个函数,该函数使用模板创建类或子类的对象
- 哪一个是最好的方法类或结构?在 C++ 中
- 对于下面给出的任务,使用类或多维数组更好吗
- 名称后跟"::"必须是类或命名空间错误,即使"::"后面是类名
- 枚举类不是类或命名空间
- 没有带有字符串数组的存储类或类型说明符
- 当您可以使用构造函数时,为什么要重载 C++ 类或结构中的 () 运算符(可调用运算符)
- 使用 boost program_options时,如何确保声明具有C++的存储类或类型说明符?
- 我是在QT5.10中的主类或永久线程中声明某些变量
- 在哪里指定内联关键字、基类、派生类或两者是否重要?
- 在派生类或基类中,我应该在哪里声明友元类
- PaError 不是类或命名空间
- 正在确定枚举类(或任何枚举类中的特定枚举值)中的枚举数
- 根据没有类或结构的另一个向量的元素对一个向量进行分类
- 抽象基类或派生类中的类变量
- 编译器错误C2653:在Visual Studio 17中没有类或名称名称