|
@@ -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 {
|
|
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;
|
|
using type = T;
|
|
};
|
|
};
|
|
-
|
|
|
|
-template <typename Tr, typename>
|
|
|
|
|
|
+template <typename T>
|
|
struct remove_reference {
|
|
struct remove_reference {
|
|
- using type = Tr;
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-template <typename Tr, typename T>
|
|
|
|
-struct remove_reference<Tr, T&> {
|
|
|
|
using type = 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>
|
|
template <typename T>
|
|
@@ -99,15 +86,20 @@ public:
|
|
|
|
|
|
namespace types {
|
|
namespace types {
|
|
template <typename T>
|
|
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>
|
|
template <typename T>
|
|
constexpr T&& forward(typename traits::remove_reference<T>::type& val)
|
|
constexpr T&& forward(typename traits::remove_reference<T>::type& val)
|
|
{
|
|
{
|
|
return static_cast<T&&>(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>
|
|
template <typename>
|
|
struct template_true_type : public true_type {
|
|
struct template_true_type : public true_type {
|