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

C++多类型容器实现:派生模板类转换与打印调用问题(非std::any/variant)

无std::any/std::variant的C++多类型容器打印解决方案

核心思路是借助多态机制,在基类中定义统一的打印接口,让模板子类实现该接口并关联现有printElement函数,无需类型转换即可完成遍历调用。

步骤1:修改基类Structure,添加纯虚打印接口

给基类增加虚析构(避免内存泄漏)和纯虚打印方法,作为所有子类的统一调用入口:

class Structure {
public:
    virtual ~Structure() = default;
    virtual void print(std::ostream& out) const = 0;
};

步骤2:让Element<T>继承Structure并实现打印接口

在模板子类中实现基类的纯虚print方法,内部直接调用你已有的printElement模板函数:

template<typename T>
class Element : public Structure {
private:
    T data;
public:
    Element(T val) : data(std::move(val)) {}
    const T& get() const { return data; }

    void print(std::ostream& out) const override {
        printElement(out, *this);
    }
};

步骤3:遍历容器时直接调用虚函数

遍历存储Structure指针的容器时,直接调用每个元素的print方法,多态会自动匹配到对应Element<T>的实现:

// 假设容器类型为std::vector<std::unique_ptr<Structure>> elements;
for (const auto& elem_ptr : elements) {
    elem_ptr->print(std::cout);
}

注意事项

  • 确保printElement模板能正确处理Element<T>类型,比如针对自定义结构体需要提前重载operator<<:
    template<class T>
    void printElement(std::ostream& out, const Element<T>& element) {
        out << element.get();
    }
    
  • 基类的虚析构必须保留,否则删除基类指针时会导致子类资源泄漏。

内容的提问来源于stack exchange,提问作者callum arul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:10:23