[英]How to compare two downcasted object types in C++
我有两个从 Base class 继承的对象。 两者都存储在向量中:
std::vector<Base*> m_vector;
如何检查第一种类型的 object 是否等于第二种类型的 object?
场景:
1.
A: public Base
B: public Base
A: public Base
A: public Base
A: public Base
B: public A
我正在简化很多事情以说明问题。 你有一个
std::vector<Base*> m_vector;
这基本上意味着:您有一个指向B
的指针向量。 实际对象是多态的,这意味着只要它们从B
继承,您就不必关心实际类型是什么。
现在你想做一些需要你知道元素的实际类型的事情。
那是一个矛盾。
解决这个矛盾最简单的方法是放弃第二点:不要关心实际类型是什么,只使用基础 class 中定义的接口。
一种方法是使用typeid
。 例如:
#include <iostream>
#include <typeinfo>
#include <memory>
#include <vector>
struct Base {
bool same_type(const Base& other) {
return typeid(*this) == typeid(other);
}
virtual ~Base() = default;
};
struct A : Base {};
struct B : Base {};
int main() {
std::vector<std::unique_ptr<Base>> x;
x.emplace_back(std::make_unique<A>());
x.emplace_back(std::make_unique<B>());
x.emplace_back(std::make_unique<B>());
std::cout << "expect 0 : " << (x[0]->same_type(*x[1])) << "\n";
std::cout << "expect 1 : " << (x[1]->same_type(*x[2])) << "\n";
}
有关typeid
的详细信息,请参阅https://en.cppreference.com/w/cpp/language/typeid 。
正如评论中所建议的,您实际上不需要编写Base::same_type()
但您可以直接使用typeid
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.