如何为模板类AsynStep创建可统一调用Run()的容器?
解决方案
要把不同模板实例化的AsynStep对象放入同一个容器,核心是利用C++多态,通过一个非模板的基类来统一类型:
步骤1:定义非模板基类
先声明一个包含纯虚Run()方法的抽象基类,作为所有AsynStep<T>的公共接口:
class IAsynStep { public: virtual ~IAsynStep() = default; // 必须定义虚析构,避免内存泄漏 virtual void Run() = 0; // 纯虚函数,强制子类实现 };
步骤2:修改模板类继承基类
让AsynStep<T>继承这个基类,并确保Run()方法覆盖基类的虚函数:
template <class T> class AsynStep : public IAsynStep { public: AsynStep(std::function<T()> worker) : Worker(std::move(worker)) {} // 覆盖基类的纯虚函数,确保多态调用 void Run() override { T result = Worker(); // 这里可以添加对返回值result的处理逻辑,符合你实际需求 } protected: std::function<T()> Worker; };
步骤3:使用容器存储基类指针
推荐用智能指针(比如std::unique_ptr)管理内存,避免手动释放的麻烦,容器类型为std::vector<std::unique_ptr<IAsynStep>>:
// 假设Func1返回int,Func2返回std::string auto step1 = std::make_unique<AsynStep<int>>(Func1); auto step2 = std::make_unique<AsynStep<std::string>>(Func2); std::vector<std::unique_ptr<IAsynStep>> Steps; Steps.push_back(std::move(step1)); Steps.push_back(std::move(step2)); // 遍历调用Run() for (auto &step : Steps) { step->Run(); }
如果一定要用原始指针(不推荐),容器可以定义为std::vector<IAsynStep*>,记得最后手动释放每个对象:
std::vector<IAsynStep*> Steps; Steps.push_back(new AsynStep<int>(Func1)); Steps.push_back(new AsynStep<std::string>(Func2)); for (auto &step : Steps) { step->Run(); } // 手动释放内存 for (auto step : Steps) { delete step; }
内容的提问来源于stack exchange,提问作者Peter2121
相关产品推荐
相关产品推荐

