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
相关产品推荐
相关产品推荐

