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

标签 c++ class types

假设我有:

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/

相关文章:

c++ - OpenGL:使用多个纹理渲染到 FBO

java - 创建动态 POJO 并为其设置值

c - 这些 typedef 在 C 中意味着什么?他们在宣布什么?

c++ - C++ 中 const 自动指针的行为

python-3.x - 从可调用类型签名中删除 Self 以匹配实例方法

c++ - 如何在 C++ 中合并两个共享相同基类的类?

c++ - multimap 像拼接 - 添加第三个图像

c++ - 编译命令有效,但运行命令没有响应

c++ - 当我收到 `slicing` 的案例时?

class - 用基类初始化派生类