本文已参与「新人创作礼」活动.一起开启掘金创作之路。
开发中,经常需要用到编译期类型,那么类型判断和擦除以及解包就显得尤为重要。
以下所有的都是属于编译期,判断也需要结合constexpr使用更佳。
判断类型【需要传入泛型】
判断是不是一个数组类型
template <class T> struct is_vector : std::false_type {};
template <class T> struct is_vector<T[]> : std::false_type {};
template <class T> struct is_vector<std::vector<T>> : std::true_type {};
判断是不是指针类型
template <class T> struct is_ptr : std::false_type {};
template <class T> struct is_ptr<T*> : std::true_type {};
template <class T> struct is_ptr<const T*> : std::true_type {};
类型擦除【需要传入泛型】
擦除数组类型,拿到里面的类型
template<typename C> struct vector_pack {};
template<template<typename, typename> class C, typename A, typename B> struct vector_pack<C<A, B>> { using type = A; };
template<typename T> using vector_pack_t = typename vector_pack<T>::type;
擦除指针类型,拿到不带指针的类型
template<typename T> struct ptr_pack {};
template<typename T> struct ptr_pack<T*> { using type = T; };
template<typename T> using ptr_pack_t = typename ptr_pack<T>::type;
类型解包【需要传入的是左值引用】
//获取元组属性的并解包该属性类型
template<typename T, typename P> constexpr const P ExP(P T::* const) {}
//设置属性的并解包所属元组
template<typename T, typename P> constexpr const P T::* ExP(P) {}
//获取元组属性的并解包所属元组类型
template<typename T, typename K> constexpr T ExT(K T::* const) { return T(); }
类型在 c++编译期0开销抽象中的作用 【泛型编程】
- c++的类型在编译期编程中,使用的非常广泛
- 尤其是高性能的场景下
- 特别是抽象后,我们就可以在编译期完成运行时的许多功能