Jelajahi Sumber

fix(c++): fix move and forward

greatbridf 2 tahun lalu
induk
melakukan
f96fe8524c
1 mengubah file dengan 19 tambahan dan 27 penghapusan
  1. 19 27
      include/types/cplusplus.hpp

+ 19 - 27
include/types/cplusplus.hpp

@@ -15,40 +15,27 @@ using false_type = constant_value<bool, false>;
 
 };
 
-namespace types::traits::inner {
+namespace types::traits {
 
-template <typename Tp, typename>
+template <typename T>
 struct remove_pointer {
-    using type = Tp;
+    using type = T;
 };
-
-template <typename Tp, typename T>
-struct remove_pointer<Tp, T*> {
+template <typename T>
+struct remove_pointer<T*> {
     using type = T;
 };
-
-template <typename Tr, typename>
+template <typename T>
 struct remove_reference {
-    using type = Tr;
-};
-
-template <typename Tr, typename T>
-struct remove_reference<Tr, T&> {
     using type = T;
 };
-
-} // namespace types::traits::inner
-
-namespace types::traits {
-
-template <typename Tp>
-struct remove_pointer
-    : inner::remove_pointer<Tp, Tp> {
+template <typename T>
+struct remove_reference<T&> {
+    using type = T;
 };
-
-template <typename Tr>
-struct remove_reference
-    : inner::remove_reference<Tr, Tr> {
+template <typename T>
+struct remove_reference<T&&> {
+    using type = T;
 };
 
 template <typename T>
@@ -99,15 +86,20 @@ public:
 
 namespace types {
 template <typename T>
-constexpr T&& move(T& val)
+constexpr typename traits::remove_reference<T>::type&& move(T&& val)
 {
-    return static_cast<T&&>(val);
+    return static_cast<typename traits::remove_reference<T>::type&&>(val);
 }
 template <typename T>
 constexpr T&& forward(typename traits::remove_reference<T>::type& val)
 {
     return static_cast<T&&>(val);
 }
+template <typename T>
+constexpr T&& forward(typename traits::remove_reference<T>::type&& val)
+{
+    return static_cast<T&&>(val);
+}
 
 template <typename>
 struct template_true_type : public true_type {