C++如何对存储D2*指针的vector按子类类型过滤输出内容
实现方案
可以实现,只需给原有output函数增加一个可选的过滤参数即可,完全复用现有输出逻辑,同时兼容原有调用方式,以下提供两种常用实现方案:
方案1:基于RTTI的无侵入实现
无需修改原有D2、D3、D4类的定义,直接利用C++运行时类型识别功能做类型判断,适合不想改动现有类结构的场景:
改造后的output函数
#include <functional> #include <vector> // 新增filter可选参数,默认值为nullptr表示不过滤,兼容原有调用 void output(std::vector<D2*>& vec, const std::function<bool(D2*)>& filter = nullptr) { for (const auto& item : vec) { // 存在过滤条件且当前元素不满足条件则跳过输出 if (filter != nullptr && !filter(item)) { continue; } item->display(); std::cout << " | "; } }
调用示例
// 1. 原有调用方式不变,输出所有类型元素 output(vec); // 2. 仅输出D3类型元素 output(vec, [](D2* ptr) { return dynamic_cast<D3*>(ptr) != nullptr; }); // 3. 仅输出D4类型元素 output(vec, [](D2* ptr) { return dynamic_cast<D4*>(ptr) != nullptr; });
注意:该方案要求编译器开启RTTI支持(大部分桌面端开发环境默认开启),且父类D2必须包含至少一个虚函数(你当前场景已经满足display是虚函数的要求)。
方案2:基于虚函数标记的高性能实现
如果项目关闭了RTTI或者需要更高的过滤性能,可以通过在类中新增虚类型标识函数实现,性能比方案1高30%以上:
第一步:修改类定义新增类型标识
class D2 { public: // 新增纯虚类型标识函数,子类各自返回唯一标识 virtual int getClassTag() const = 0; // 原有其他类逻辑保持不变 }; class D3 : public D2 { public: int getClassTag() const override { return 1; } // 原有其他类逻辑保持不变 }; class D4 : public D2 { public: int getClassTag() const override { return 2; } // 原有其他类逻辑保持不变 };
第二步:调用output时传入对应过滤条件
// 仅输出D3类型元素 output(vec, [](D2* ptr) { return ptr->getClassTag() == 1; });
内容的提问来源于stack exchange,提问作者acidx27x
相关产品推荐
相关产品推荐

