寻求按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; }
核心逻辑说明
- 插入排序思想:递归地将每个类型插入到已排序的类型序列中,通过编译期常量比较确定插入位置,保证整个序列始终有序。
- 编译期计算:所有排序逻辑都在编译期完成,不会产生运行时开销。
- 灵活性:只要类型拥有
static constexpr int getType()静态成员函数,就能被纳入排序逻辑,无需额外修改。
内容的提问来源于stack exchange,提问作者X1ngChui
相关产品推荐
相关产品推荐

