C++中派生类容器转基类容器的优化通用实现问询
C++ 容器兼容与代码冗余优化问题
类结构定义
我们定义了如下类结构:
struct A { int x; auto display() const noexcept -> void { /* 显示逻辑 */ } }; struct B final : A { /* 无额外成员 */ auto foo() const noexcept -> void { ... } };
原始函数的兼容性问题
实现了如下处理函数:
auto display_all_as(std::span<A const> as) noexcept -> void { for (auto const a : as) a.display(); }
该函数可正常处理std::array<A, 3>类型参数,但无法接收std::array<B, 3>类型参数,编译报错:不存在从array<B,3>到array<A,3>的已知转换。
模板方案的缺陷
将函数修改为模板形式后解决了兼容问题:
template <class T> requires std::ranges::range<T> and std::is_convertible_v<typename T::value_type, A> auto constexpr display_all_as(T as) noexcept -> void { for (auto const a : as) a.display(); }
但该方案存在两个明显问题:
- 依赖容器提供
value_type类型别名,自定义容器可能不满足这一条件,通用性不足; - 使用clang++ 19.1.7编译(编译命令:
clang++ main.cpp -std=c++20 -O3 -S)时,会针对A和B分别生成逻辑完全一致的汇编函数,造成代码冗余。
需求
希望得到更优化、更通用的实现方案,避免生成重复汇编代码。尽管通常不能直接将array<子类>转换为array<父类>以防止对象切片,但本场景中B未添加任何额外成员,理论上可以实现安全的转换。
内容的提问来源于stack exchange,提问作者Izik P.
相关产品推荐
相关产品推荐

