瀏覽代碼

type_traits: make is_iterator also support void *

Michele Caini 4 年之前
父節點
當前提交
4311e2e686
共有 2 個文件被更改,包括 23 次插入2 次删除
  1. 22 2
      src/entt/core/type_traits.hpp
  2. 1 0
      test/entt/core/type_traits.cpp

+ 22 - 2
src/entt/core/type_traits.hpp

@@ -446,6 +446,26 @@ struct is_complete<Type, std::void_t<decltype(sizeof(Type))>>: std::true_type {}
 template<typename Type>
 inline constexpr bool is_complete_v = is_complete<Type>::value;
 
+/**
+ * @cond TURN_OFF_DOXYGEN
+ * Internal details not to be documented.
+ */
+
+namespace internal {
+
+template<typename, typename = void>
+struct is_iterator: std::false_type {};
+
+template<typename Type>
+struct is_iterator<Type, std::void_t<typename std::iterator_traits<Type>::iterator_category>>: std::true_type {};
+
+} // namespace internal
+
+/**
+ * Internal details not to be documented.
+ * @endcond
+ */
+
 /**
  * @brief Provides the member constant `value` to true if a given type is an
  * iterator, false otherwise.
@@ -456,8 +476,8 @@ struct is_iterator: std::false_type {};
 
 /*! @copydoc is_iterator */
 template<typename Type>
-struct is_iterator<Type, std::void_t<typename std::iterator_traits<Type>::iterator_category>>
-    : std::true_type {};
+struct is_iterator<Type, std::enable_if_t<!std::is_same_v<std::remove_const_t<std::remove_pointer_t<Type>>, void>>>
+    : internal::is_iterator<Type> {};
 
 /**
  * @brief Helper variable template.

+ 1 - 0
test/entt/core/type_traits.cpp

@@ -136,6 +136,7 @@ TEST(TypeTraits, IsComplete) {
 
 TEST(TypeTraits, IsIterator) {
     static_assert(!entt::is_iterator_v<void>);
+    static_assert(!entt::is_iterator_v<void *>);
     static_assert(!entt::is_iterator_v<int>);
 
     static_assert(entt::is_iterator_v<int *>);