Lambda使用动态强制转换

时间:2017-07-13 07:26:11

标签: c++ templates vector lambda

我们假设我们有3个类:

class A
{
public:
    int a;
    virtual ~A() = default;
};

class B : public A
{
public:
    int b;
};

class C : public A
{
public:
    int c;
};

包含从A

派生的多态对象的向量
std::vector<A*> objects;

我想要一个模板方法,它将从模板中给出的vector类型的向量返回一个对象,如果该对象存在,但我不知道如何编写它。 这不起作用:

template<typename ComponentType>
ComponentType * GetComponent()
{
    bool pred = std::find_if(objects.begin(), objects.end(),
    [=](A * obj)
    {
        return 
            dynamic_cast<ComponentType*>(obj) != nullptr;
    });

    return pred != objects.end();
}

我知道可以使用该代码完成:

template<typename ComponentType>
ComponentType * GetComponent()
{
    for (item : objects)
    {
        auto casted = dynamic_cast<ComponentType*>(item);

        if (casted)
            return casted;
    }

    return nullptr;
}

但我想使用lambda。

1 个答案:

答案 0 :(得分:2)

它至少不起作用,因为std::find_if返回迭代器,而不是 bool

如果没有这样的元素,您可以更改解决方案以修复它并返回指向元素的指针或 nullptr

template<typename ComponentType>
ComponentType * GetComponent()
{
    auto it = std::find_if(objects.begin(), objects.end(),
    [](A * obj)
    {
        return dynamic_cast<ComponentType*>(obj) != nullptr;
    });

    return it != objects.end()
        ? dynamic_cast<ComponentType*>(*it)
        : nullptr;
}

注意,如果可能的话,最好完全避免使用 dynamic_cast 。例如,您可以向A类添加虚拟方法,以某种方式标识对象,然后在BC中覆盖它,并用于查找请求的对象。