如何实现同时支持指针数组与结构体数组的通用排序函数?
你可以用编译时分支(C++17及以上)或者提取统一的id获取逻辑来消除代码重复,下面是两种更优的实现方式:
方式一:用if constexpr在lambda内做编译时分支
这种方式不需要额外函数,直接在比较逻辑里通过编译时判断处理指针和值类型:
#include <vector> #include <algorithm> #include <type_traits> template<typename ItemType> std::vector<ItemType> SimpleSort(std::vector<ItemType>&& items) { std::sort(items.begin(), items.end(), [](const auto& a, const auto& b) { // 编译时判断当前类型是否为指针,避免运行时开销 if constexpr (std::is_pointer_v<std::decay_t<decltype(a)>>) { return a->id > b->id; } else { return a.id > b.id; } } ); return std::move(items); }
方式二:提取统一的id获取辅助函数
把获取id的逻辑抽离成模板函数,让比较逻辑完全统一:
#include <vector> #include <algorithm> // 辅助模板:支持值类型和指针类型的id提取 template<typename T> constexpr const auto& get_item_id(const T& item) { return item.id; } template<typename T> constexpr const auto& get_item_id(const T* item_ptr) { return item_ptr->id; } template<typename ItemType> std::vector<ItemType> SimpleSort(std::vector<ItemType>&& items) { std::sort(items.begin(), items.end(), [](const auto& left, const auto& right) { return get_item_id(left) > get_item_id(right); } ); return std::move(items); }
这两种方案都避免了重复的std::sort调用,而且都是编译时处理,不会带来额外的运行时开销。相比你原来的写法,代码更简洁易维护,也符合模板编程的最佳实践。
内容的提问来源于stack exchange,提问作者MegaMan
相关产品推荐
相关产品推荐

