gpt4 book ai didi

c++ - 使用不包括基类的模板从 C++ 列表中查找特定类型

转载 作者:行者123 更新时间:2023-11-28 04:26:09 25 4
gpt4 key购买 nike

这可能是不可能的,所以问题的替代解决方案也足够了

我有一个要跟踪的事件列表

class Activity {
public:
virtual void DoSomething() = 0 ;
};

std::vector<Activity*> activities;

假设我有以下子类

class GraphicsActivity : public Activity {
public:
virtual void DoSomething() { }
void HandleGraphics() { /* do some management */; }
};

class UpdateActivity : public Activity {
public:
virtual void DoSomething() { ; }
};

class PhysicsActivity : public Activity {
public:
virtual void DoSomething() { ; }
};

现在假设我们要从我们的列表中获取其中一项事件。一个函数看起来像

template<typename T> T* GetActivity() {
for(int i = 0; i < activities.size(); i++) {
T* cast = dynamic_cast<T*>(activities[i]);
if(cast != nullptr) {
return cast;
}
}
return nullptr;
}

我们可以这样使用它:

activities.push_back(new GraphicsActivity());
activities.push_back(new PhysicsActivity ());
activities.push_back(new UpdateActivity ());

GraphicsActivity* g = GetActivity<GraphicsActivity>();

假设我们有另一个事件需要使用多态性来使用基类的一些方法。

class 3DGraphicsActivity : public GraphicsActivity {
public:
void Handle3DGraphics() {
/* Utilize base class function */
this->HandleGraphics();
/* do some extra work */
}
};

现在我们想要获得与以前相同的事件,我们的列表现在看起来像下面的顺序一样:

activities.push_back(new GraphicsActivity3D());
activities.push_back(new GraphicsActivity());
activities.push_back(new PhysicsActivity ());
activities.push_back(new UpdateActivity ());

但是我们想要GraphicsActivity的原始类型,所以我们去获取它:

GraphicsActivity* g = GetActivity<GraphicsActivity>();

我们实际上会得到一个指向列表中第一个条目的指针,因为它共享一个 GraphicsActivity 类型的基类。

这就是问题所在:我如何编写这样一个列表,其项目必须共享相同的基类 Activity 同时还能够从列表中获取确切的类型而不落入 我们刚刚解释过的 dynamic_cast 陷阱?

最佳答案

typeid operator可用于检查多态对象是否具有特定的最派生类型。

#include <typeinfo>
// ...

template<typename T> T* GetActivity() {
for(int i = 0; i < activities.size(); i++) {
auto* act = activities[i];
if (act != nullptr && typeid(*act) == typeid(T)) {
return dynamic_cast<T*>(act);
}
}
return nullptr;
}

请谨慎使用此模式,因为它限制了使一个类的行为与另一个类完全相同的能力,除了特定的更改。但它可能适合您的界面。

关于c++ - 使用不包括基类的模板从 C++ 列表中查找特定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54266044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com