C++中迭代器方法名不同时如何优化std::is_same分支重复代码
优化方案
可以通过统一迭代器获取接口的方式消除冗余代码,有两种常用的实现思路:
方案1:重载全局适配函数(推荐,易扩展)
先为两种类型重载统一的迭代器获取函数,后续新增类型只要新增对应重载即可,无需修改原有业务逻辑:
// 迭代器适配函数,自动匹配对应类型的实现 auto get_begin(A& obj) { return obj.a_begin(); } auto get_end(A& obj) { return obj.a_end(); } auto get_begin(B& obj) { return obj.b_begin(); } auto get_end(B& obj) { return obj.b_end(); }
改造后的foo函数无需分支判断,直接调用统一的适配函数即可:
template<class T> void foo(T t) { for (auto it = get_begin(t); it != get_end(t); ++it) { // 原有的公共逻辑直接写在这里,无需重复 } }
如果使用C++20及以上版本,可以配合概念约束模板参数,传入不支持的类型时会给出更清晰的编译报错:
#include <concepts> template<typename T> concept SupportedIterable = requires(T t) { { get_begin(t) } -> std::input_or_output_iterator; { get_end(t) } -> std::sentinel_for<decltype(get_begin(t))>; }; template<SupportedIterable T> void foo(T t) { for (auto it = get_begin(t); it != get_end(t); ++it) { // 公共逻辑 } }
方案2:局部抽取迭代器范围(无需新增全局函数)
如果只有A、B两个类型,后续不会扩展,也可以在函数内先抽取迭代器范围再统一处理,无需新增全局函数:
#include <utility> template<class T> void foo(T t) { // 编译期确定迭代器范围 auto [begin, end] = [&] { if constexpr (std::is_same_v<T, A>) { return std::pair{t.a_begin(), t.a_end()}; } else if constexpr (std::is_same_v<T, B>) { return std::pair{t.b_begin(), t.b_end()}; } }(); // 统一遍历逻辑,无需重复 for (auto it = begin; it != end; ++it) { // 公共逻辑 } }
内容的提问来源于stack exchange,提问作者elo
相关产品推荐
相关产品推荐

