所以我正在开发一种各种游戏引擎,而且我一直在努力解决这个问题。我不确定这是设计问题,还是我对C ++没有必要的理解
简单地说,我有一个指向“BaseComponent”类型的指针向量。它由指向派生类,AComponent,BComponent等的指针组成。我想知道是否有一种优雅的方法来返回给定派生类型的向量中的第一个元素,并将其转换为正确的派生类型。在伪代码中:
BComponent * bComp = getFirstElementOfType(vectorOfComponents, BComponent);
它将自动找到与第二个参数中放置的类型匹配的第一个元素,并将其转换为正确的派生类型,如果向量中没有组件匹配该类型,则返回null。我假设我们必须使用这样的模板(如果可能的话),但是在修补它一段时间之后我现在还没有想出任何能够完成这项工作的东西。希望一切都有意义,谢谢你的时间。
答案 0 :(得分:2)
您可以执行以下操作:
template <typename Derived>
Derived* getFirstElementOfType(const std::vector<BaseComponent*>& components)
{
for (auto* component : components) {
auto* p = dynamic_cast<Derived*>(component);
if (p != nullptr) {
return p;
}
}
return nullptr;
}
或
template <typename Derived>
Derived* getFirstElementOfType(const std::vector<BaseComponent*>& components)
{
auto it = std::find_if(components.begin(), components.end(),
[](BaseComponent* component)
{
return dynamic_cast<Derived*>(component) != nullptr;
});
if (it != components.end()) {
return static_cast<Derived*>(*it);
}
return nullptr;
}
然后这样称呼:
BComponent* bComp = getFirstElementOfType<BComponent>(vectorOfComponents);
答案 1 :(得分:1)
我将定义一个类似于类std::exception
virtual const char* what() const noexcept;
并使用它来查找目标派生类的指针。
答案 2 :(得分:1)
返回特定类型的东西:
template<typename TBase, typename UDerived>
UDerived* findFirstOfType(std::vector<TBase*> & items)
{
for (auto item : items) {
if ((auto d = dynamic_cast<UDerived*>(item)) != nullptr)
return d;
}
return nullptr;
}
叫做:
Orange * orange = findFirstOfType<Fruit, Orange>(items);