You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现同时支持指针数组与结构体数组的通用排序函数?

你可以用编译时分支(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:22:16