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

寻求按static成员函数返回值排序C++模板参数的模板代码

基于getType()静态成员的模板参数类型排序实现

以下是一个基于C++模板元编程的实现,通过插入排序逻辑,根据模板参数的static constexpr int getType()返回值对类型序列进行升序排序,最终结果以std::tuple形式输出:

#include <iostream>
#include <tuple>
#include <type_traits>

struct A {
    static constexpr int getType() { return 1; }
};

struct B {
    static constexpr int getType() { return 2; }
};

struct C {
    static constexpr int getType() { return 3; }
};

// 辅助函数:获取类型的getType返回值
template <typename T>
constexpr int get_type_value() {
    return T::getType();
}

// 元函数:将单个类型插入到已排序的tuple中
template <typename Tuple, typename T>
struct InsertIntoSorted;

// 空tuple的边界情况
template <typename T>
struct InsertIntoSorted<std::tuple<>, T> {
    using type = std::tuple<T>;
};

// 递归处理非空tuple,确定插入位置
template <typename First, typename... Rest, typename T>
struct InsertIntoSorted<std::tuple<First, Rest...>, T> {
private:
    static constexpr bool insert_before = (get_type_value<T>() <= get_type_value<First>());
    using insert_front = std::tuple<T, First, Rest...>;
    using insert_back = std::tuple<First, typename InsertIntoSorted<std::tuple<Rest...>, T>::type>;
public:
    using type = std::conditional_t<insert_before, insert_front, insert_back>;
};

// 主排序元函数
template <typename... Ts>
struct Sort;

// 空参数包的边界情况
template <>
struct Sort<> {
    using type = std::tuple<>;
};

// 单个参数的情况
template <typename T>
struct Sort<T> {
    using type = std::tuple<T>;
};

// 递归拆解参数包,逐个插入排序
template <typename First, typename... Rest>
struct Sort<First, Rest...> {
    using sorted_rest = typename Sort<Rest...>::type;
    using type = typename InsertIntoSorted<sorted_rest, First>::type;
};

int main() {
    using Sorted = Sort<C, A, B>::type; // 推导为std::tuple<A, B, C>
    // 编译期验证排序结果
    static_assert(std::is_same_v<Sorted, std::tuple<A, B, C>>, "排序结果不符合预期");
    
    std::cout << typeid(Sorted).name() << std::endl;
    return 0;
}

核心逻辑说明

  1. 插入排序思想:递归地将每个类型插入到已排序的类型序列中,通过编译期常量比较确定插入位置,保证整个序列始终有序。
  2. 编译期计算:所有排序逻辑都在编译期完成,不会产生运行时开销。
  3. 灵活性:只要类型拥有static constexpr int getType()静态成员函数,就能被纳入排序逻辑,无需额外修改。

内容的提问来源于stack exchange,提问作者X1ngChui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:52:47