You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为模板类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:35:01