一些比较常用的C++模板元的东西
生成一个多阶的vector
template <typename T, int N> struct get_vec_by_rank; template <typename T> struct get_vec_by_rank<T, 0> { using Type = T; }; template <typename T, int N> struct get_vec_by_rank { using Type = std::vector<typename get_vec_by_rank<T, N - 1>::Type>; }; template<typename T,int N> using get_vec_by_rank_t = typename get_vec_by_rank<T,N>::Type; int main() { using vec = get_vec_by_rank_t<double, 3>; }
获得一个vector的阶数
template <typename T> constexpr int get_vec_rank = 0; template <typename T> constexpr int get_vec_rank<std::vector<T>> = 1 + get_vec_rank<T>; int main() { using vec = get_vec_by_rank_t<double, 3>; constexpr int rk = get_vec_rank<vec>; }
获得一堆类型的最大值
template<typename T, typename ...Ts> constexpr int max_size = sizeof(T) > max_size<Ts...> ? sizeof(T) : max_size<Ts...>; template<typename T> constexpr int max_size<T> = sizeof(T); int main() { constexpr int mx = max_size<int, double,char,short>; }
获得一个对象有多少个成员变量
struct Any { template<typename T> operator T(); }; template<typename T> constexpr size_t get_member_size(auto&&...Args) { if constexpr (!requires{T{ Args... }; }) { return sizeof...(Args) - 1; } else { return get_member_size<T>(Args..., Any{}); } } int main() { struct X{int a;char b;double c;std::string_view d;}; constexpr int sz = get_member_size<X>(); }