gpt4 book ai didi

c++ - dynamic_cast 到相同的类型不检查对象的类型

转载 作者:行者123 更新时间:2023-11-30 04:33:42 28 4
gpt4 key购买 nike

我正在尝试确定 T* 指针指向的对象是否真的是 T 对象,或者其他一些不相关的类型。我试过 dynamic_cast,但它一点用处都没有,它返回指针本身而不是 null,即使很明显它没有指向有效的 T 对象:

Object* garbage = reinterpret_cast<Object*>(0x12345678);
if( dynamic_cast<Object*>(garbage) == NULL ){
cout << "Expected behaviour (by me)" << endl;
}else{
cout << "You've got to be kidding me" << endl;
}

是否有任何解决方法或其他解决方案?我已经尝试在 dynamic_cast 之前转换为 void* 和 char* 无济于事,typeid 也不够,因为我也想接受子类。

一些上下文:我正在编写一个自定义数组类,实现不同类型数组之间的浅层转换,比如 Array<Object*>Array<String*> ,我想通过在每个元素访问时进行动态类型检查来保证最小的类型安全,因为示例:

#define DEBUG
Array<String*> v(10);
Array<Object*> o = v;
o[0] = new Integer(1); // this is technically illegal but no idea how to check
//Array<String*> w = o; // this fails with an exception
String* str = v[0]; // but this should fail horribly as well
cout << str << endl;

转换为 Object*,然后对 Object* 进行类型检查在很多情况下都有效,但在 Array<Object*> 的情况下会失败,尽管我不确定是否可以将非 Object 的东西插入到Array<Object*> 不使用 reinterpret_cast。

最佳答案

根据您的示例,听起来您拥有浅拷贝数组,有人可能会欺骗这些数组包含与它们应该包含的类型不同的类型。我认为这个问题的“正常”解决方案是让用户难以做到(即不提供 Array<T>Array<U> 之间的转换)。但是,如果您坚持自己的想法,我认为这会奏效:

template<typename Subclass>
class Array {
public:
// ...
Subclass *operator [] (size_t index) {
assert( index < size_ );
assert( dynamic_cast<Subclass*>(static_cast<Object*>(internal_[index])) != NULL );
// ...
}
// ...
private:
size_t size_;
Subclass **internal_;
};

你可以做一些模板元魔术和静态断言来确保Subclass实际上是 Object 的子类(究竟如何是一个完全不同的话题)。一旦解决了这个问题,向下转换为一个 Object* 然后返回到 Subclass使用 dynamic_cast 应该可以实现您的目标。

关于c++ - dynamic_cast 到相同的类型不检查对象的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6542135/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com