C++类型判断、擦除、解包【泛型编程】

376 阅读1分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

开发中,经常需要用到编译期类型,那么类型判断和擦除以及解包就显得尤为重要。

以下所有的都是属于编译期,判断也需要结合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++的类型在编译期编程中,使用的非常广泛
  • 尤其是高性能的场景下
  • 特别是抽象后,我们就可以在编译期完成运行时的许多功能