我们假设我们有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。
答案 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
类添加虚拟方法,以某种方式标识对象,然后在B
和C
中覆盖它,并用于查找请求的对象。