瀏覽代碼

STL: extend type_traits to deal with member pointers

Vito Gamberini 1 年之前
父節點
當前提交
e0f9d81f09
共有 2 個文件被更改,包括 34 次插入0 次删除
  1. 8 0
      Help/dev/source.rst
  2. 26 0
      Utilities/std/cmext/type_traits

+ 8 - 0
Help/dev/source.rst

@@ -249,6 +249,14 @@ These are:
   * ``cm::is_unique_ptr``:
     Checks if a type is a ``std::unique_ptr`` type.
 
+  * ``cm::remove_member_pointer``
+    Produces the underlying type of a member-pointer type, ie, given ``T C::*``,
+    returns ``T``.
+
+  * ``cm::member_pointer_class``
+    Produces the class associated with a member-pointer type, ie, given
+    ``T C::*``, returns ``C``.
+
 CMake assumes the compiler supports ``#pragma once``. Use this for all
 hand-written header files.
 

+ 26 - 0
Utilities/std/cmext/type_traits

@@ -82,4 +82,30 @@ using is_sequence_container =
                     !cm::is_associative_container<T>::value &&
                     !cm::is_unordered_associative_container<T>::value>;
 
+template <typename T>
+struct remove_member_pointer
+{
+  typedef T type;
+};
+template <typename T, typename U>
+struct remove_member_pointer<T U::*>
+{
+  typedef T type;
+};
+template <typename T>
+using remove_member_pointer_t = typename remove_member_pointer<T>::type;
+
+template <typename T>
+struct member_pointer_class
+{
+  typedef T type;
+};
+template <typename T, typename U>
+struct member_pointer_class<U T::*>
+{
+  typedef T type;
+};
+template <typename T>
+using member_pointer_class_t = typename member_pointer_class<T>::type;
+
 } // namespace cm