Index: third_party/mojo/src/mojo/public/cpp/bindings/lib/callback_internal.h |
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/callback_internal.h b/third_party/mojo/src/mojo/public/cpp/bindings/lib/callback_internal.h |
index f76ebef59e6c67ba12b4f13e67534be49cc3cdb7..9df5b40a73555e7f72aa8ac046a62aefd1701058 100644 |
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/callback_internal.h |
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/callback_internal.h |
@@ -5,6 +5,8 @@ |
#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_CALLBACK_INTERNAL_H_ |
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_CALLBACK_INTERNAL_H_ |
+#include "mojo/public/cpp/bindings/lib/template_util.h" |
+ |
namespace mojo { |
class String; |
@@ -20,6 +22,31 @@ struct Callback_ParamTraits<String> { |
typedef const String& ForwardType; |
}; |
+template <typename T, typename... Args> |
+struct HasCompatibleCallOperator { |
+ // This template's second parameter is the signature of the operator() |
+ // overload we want to try to detect: |
+ // void operator()(Args...) const; |
+ template <typename U, |
+ void (U::*)( |
+ typename internal::Callback_ParamTraits<Args>::ForwardType...) |
+ const> |
+ struct TestType {}; |
+ |
+ // This matches type U if it has a call operator with the |
+ // expected signature. |
+ template <typename U> |
+ static YesType Test(TestType<U, &U::operator()>*); |
+ |
+ // This matches anything else. |
+ template <typename U> |
+ static NoType Test(...); |
+ |
+ // HasCompatibleCallOperator<T, Args...>::value will be true if T has a |
+ // compatible call operator. |
+ enum { value = (sizeof(Test<T>(nullptr)) == sizeof(YesType)) }; |
+}; |
+ |
} // namespace internal |
} // namespace mojo |