|
17 | 17 | // The macros below are internal implementation details for macro defined in nativeModules.h |
18 | 18 | // |
19 | 19 |
|
| 20 | +// ADL-based fallback: returns false for any type not tagged by the macros below. |
| 21 | +// Using ADL instead of explicit template specialization allows the macros to be |
| 22 | +// used inside a namespace (explicit specializations of a global template must |
| 23 | +// occur at global scope, which the macros cannot guarantee). |
20 | 24 | template <typename T> |
21 | | -struct IsReactTurboModule; |
| 25 | +constexpr bool ReactIsReactTurboModuleImpl(T *) noexcept { |
| 26 | + return false; |
| 27 | +} |
22 | 28 |
|
23 | | -// Default to false if no specific override |
24 | 29 | template <typename T> |
25 | | -struct IsReactTurboModule : std::false_type {}; |
| 30 | +struct IsReactTurboModule : std::bool_constant<ReactIsReactTurboModuleImpl(static_cast<T *>(nullptr))> {}; |
26 | 31 |
|
27 | 32 | #define INTERNAL_REACT_MODULE_REGISTRATION_AND_PROVIDER( \ |
28 | 33 | moduleStruct, moduleName, eventEmitterName, isReactTurboModule) \ |
29 | 34 | struct moduleStruct; \ |
30 | 35 | \ |
31 | | - template <> \ |
32 | | - struct IsReactTurboModule<moduleStruct> : std::isReactTurboModule##_type {}; \ |
| 36 | + constexpr bool ReactIsReactTurboModuleImpl(moduleStruct *) noexcept { return isReactTurboModule; } \ |
33 | 37 | \ |
34 | 38 | template <class TDummy> \ |
35 | 39 | struct moduleStruct##_ModuleRegistration final : winrt::Microsoft::ReactNative::ModuleRegistration { \ |
@@ -70,8 +74,7 @@ struct IsReactTurboModule : std::false_type {}; |
70 | 74 | moduleStruct, moduleName, eventEmitterName, isReactTurboModule) \ |
71 | 75 | struct moduleStruct; \ |
72 | 76 | \ |
73 | | - template <> \ |
74 | | - struct IsReactTurboModule<moduleStruct> : std::isReactTurboModule##_type {}; \ |
| 77 | + constexpr bool ReactIsReactTurboModuleImpl(moduleStruct *) noexcept { return isReactTurboModule; } \ |
75 | 78 | \ |
76 | 79 | template <class TRegistry> \ |
77 | 80 | constexpr void GetReactModuleInfo(moduleStruct *, TRegistry ®istry) noexcept { \ |
|
0 commit comments