如何比较 C++ 中的类类型?

Mar*_*ics 5 c++ types class

可以说我有:

class Base {/*...*/}
class Derived1: public Base {/*...*/}
class Derived2: public Base {/*...*/}
Run Code Online (Sandbox Code Playgroud)

..我有:

class SomeClass {
public:
    template<typename DerivedType>
    DerivedType GetDerived();
private:
    vector<Base*> m_classes;
}
Run Code Online (Sandbox Code Playgroud)

GetDerived()我遍历 m_classes 向量的函数中,我想做一些类似的事情:

if(m_classes[i] == DerivedType) {
    return m_classes[i];
}
Run Code Online (Sandbox Code Playgroud)

...并假设我们知道 m_classes 中的一个对象将包含一个“DerivedType”对象。

例子:

m_classes[2] = Base* BasePtr = new Derived1;
Run Code Online (Sandbox Code Playgroud)

.. 在这种情况下,我想像这样使用 GetDerived 函数:

GetDerived<Derived1>();
Run Code Online (Sandbox Code Playgroud)

.. 这应该返回 m_classes[2]

我该怎么做呢?如何将基指针对象与派生类类型进行比较?更准确地说,这个GetDerived()函数应该是什么样子的?

Que*_*tin 3

当您需要以不同的方式对待不同类的对象时,将它们存储在同一个容器中是一个坏主意。

不过,这一次,C++ 可以满足您的需求。将尝试将(无论它是什么)dynamic_cast<B>(a)转换为类型。如果运行时类不匹配,它将返回。aBnullptr

您可以这样写GetDerived

template <class Tsearched>
Tsearched *GetDerived() {
    for(auto c : m_classes) {
        if(Tsearched *ptr = dynamic_cast<Tsearched*>(c))
            return ptr;
    }
    return nullptr;
}
Run Code Online (Sandbox Code Playgroud)

或者,借助标准算法:

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);
}
Run Code Online (Sandbox Code Playgroud)

然而,让我再说一遍,这里存在一个设计问题。RTTI(dynamic_cast使用什么)既不优雅,也不快。