假设我有:
class Base {/*...*/}
class Derived1: public Base {/*...*/}
class Derived2: public Base {/*...*/}
..我有:
class SomeClass {
public:
template<typename DerivedType>
DerivedType GetDerived();
private:
vector<Base*> m_classes;
}
在 GetDerived()
函数中,我遍历了 m_classes vector ,我想做类似的事情:
if(m_classes[i] == DerivedType) {
return m_classes[i];
}
...假设我们知道 m_classes 中的对象之一将包含“DerivedType”对象。
示例:
m_classes[2] = Base* BasePtr = new Derived1;
.. 在这种情况下,我想像这样使用 GetDerived 函数:
GetDerived<Derived1>();
.. 这应该返回 m_classes[2]
我该怎么做?如何将基指针对象与派生类类型进行比较?更准确地说,GetDerived()
函数应该是什么样子?
最佳答案
当您需要区别对待不同类的对象时,将它们存储在同一个容器中是一个坏主意。
不过这次 C++ 有您要找的东西。 dynamic_cast<B>(a)
将尝试转换 a
(不管是什么)输入 B
.如果运行时类不匹配,它将返回 nullptr
.
你可以这样写 GetDerived
:
template <class Tsearched>
Tsearched *GetDerived() {
for(auto c : m_classes) {
if(Tsearched *ptr = dynamic_cast<Tsearched*>(c))
return ptr;
}
return nullptr;
}
或者,在标准算法的帮助下:
template <class Tsearched>
Tsearched *GetDerived() {
auto found = std::find_if(m_classes.begin(), m_classes.end(), [](Base *ptr) {
return dynamic_cast<Tsearched*>(ptr);
});
return found == m_classes.end() ? nullptr : static_cast<Tsearched*>(*found);
}
但是,让我重复一遍,这里存在设计问题。 RTTI(dynamic_cast
使用的)既不优雅也不快速。
关于c++ - 如何比较 C++ 中的类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27432974/