Index: base/callback_internal.h |
diff --git a/base/callback_internal.h b/base/callback_internal.h |
index 4b47bc7978db33f0946a9c30645d4b35f241751e..a36aa1fa6f71c58ff9f837fae3c45079bb996bbe 100644 |
--- a/base/callback_internal.h |
+++ b/base/callback_internal.h |
@@ -127,11 +127,25 @@ struct CallbackParamTraitsForNonMoveOnlyType; |
// parameters by const reference. In this case, we end up passing an actual |
// array type in the initializer list which C++ does not allow. This will |
// break passing of C-string literals. |
-template <typename T> |
+template <typename T, typename = void> |
struct CallbackParamTraits |
- : std::conditional<IsMoveOnlyType<T>::value, |
- CallbackParamTraitsForMoveOnlyType<T>, |
- CallbackParamTraitsForNonMoveOnlyType<T>>::type { |
+ : std::conditional<is_move_only<typename std::decay<T>::type>::value, |
+ CallbackParamTraitsForMoveOnlyType<T>, |
+ CallbackParamTraitsForNonMoveOnlyType<T>>::type { |
+}; |
+ |
+template <typename T> |
+struct CallbackParamTraits< |
+ T, |
+ typename std::conditional<false, |
+ typename std::decay<T>::type::value_type, |
+ void>::type> |
+ : public std::conditional< |
+ base::is_move_only<typename std::decay<T>::type>::value || |
+ base::is_move_only< |
+ typename std::decay<T>::type::value_type>::value, |
+ CallbackParamTraitsForMoveOnlyType<T>, |
+ CallbackParamTraitsForNonMoveOnlyType<T>>::type { |
}; |
template <typename T> |
@@ -145,11 +159,11 @@ struct CallbackParamTraitsForNonMoveOnlyType { |
// this will guard against us accidentally storing a reference parameter. |
// |
// The ForwardType should only be used for unbound arguments. |
-template <typename T> |
-struct CallbackParamTraitsForNonMoveOnlyType<T&> { |
- typedef T& ForwardType; |
- typedef T StorageType; |
-}; |
+// template <typename T> |
+// struct CallbackParamTraits<T&> { |
+ // typedef T& ForwardType; |
+ // typedef T StorageType; |
+// }; |
// Note that for array types, we implicitly add a const in the conversion. This |
// means that it is not possible to bind array arguments to functions that take |
@@ -184,7 +198,7 @@ struct CallbackParamTraitsForNonMoveOnlyType<T[]> { |
// function or a cast would not be usable with Callback<> or Bind(). |
template <typename T> |
struct CallbackParamTraitsForMoveOnlyType { |
- typedef T ForwardType; |
+ typedef typename std::remove_reference<T>::type&& ForwardType; |
typedef T StorageType; |
}; |
@@ -214,6 +228,12 @@ typename enable_if<IsMoveOnlyType<T>::value, T>::type CallbackForward(T& t) { |
return t.Pass(); |
} |
+template <typename T> |
+auto CallbackForward2(T&& t) -> |
+ typename CallbackParamTraits<T>::ForwardType { |
+ return static_cast<typename CallbackParamTraits<T>::ForwardType>(t); |
+} |
+ |
} // namespace internal |
} // namespace base |