UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Invoke.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
6#include "AutoRTFM.h"
8#include <type_traits>
9
10
11namespace UE::Core::Private
12{
13 template <typename OuterType, typename TargetType>
14 constexpr auto DereferenceIfNecessary(TargetType&& Target, const volatile OuterType* TargetPtr)
15 -> decltype((TargetType&&)Target)
16 {
17 // If the target is the same as or is derived from the outer type, just return it unchanged.
18 return (TargetType&&)Target;
19 }
20
21 template <typename OuterType, typename TargetType>
22 constexpr auto DereferenceIfNecessary(TargetType&& Target, ...)
23 -> decltype(*(TargetType&&)Target)
24 {
25 // If the target is not related to the outer type, assume it's a (possibly smart) pointer and dereference it.
26 return *(TargetType&&)Target;
27 }
28}
29
30
43template <typename FuncType, typename... ArgTypes>
44AUTORTFM_INFER UE_FORCEINLINE_HINT constexpr auto Invoke(FuncType&& Func, ArgTypes&&... Args)
45 -> decltype(((FuncType&&)Func)((ArgTypes&&)Args...))
46{
47 return ((FuncType&&)Func)((ArgTypes&&)Args...);
48}
49
50template <typename ReturnType, typename ObjType, typename TargetType>
51AUTORTFM_INFER constexpr auto Invoke(ReturnType ObjType::*pdm, TargetType&& Target)
52 -> decltype(UE::Core::Private::DereferenceIfNecessary<ObjType>((TargetType&&)Target, &Target).*pdm)
53{
54 return UE::Core::Private::DereferenceIfNecessary<ObjType>((TargetType&&)Target, &Target).*pdm;
55}
56
57template <
58 typename PtrMemFunType,
59 typename TargetType,
60 typename... ArgTypes,
62>
63AUTORTFM_INFER constexpr auto Invoke(PtrMemFunType PtrMemFun, TargetType&& Target, ArgTypes&&... Args)
64 -> decltype((UE::Core::Private::DereferenceIfNecessary<ObjType>((TargetType&&)Target, &Target).*PtrMemFun)((ArgTypes&&)Args...))
65{
66 return (UE::Core::Private::DereferenceIfNecessary<ObjType>((TargetType&&)Target, &Target).*PtrMemFun)((ArgTypes&&)Args...);
67}
68
69
84#define UE_PROJECTION(FuncName) \
85 [](auto&&... Args) -> decltype(auto) \
86 { \
87 return FuncName((decltype(Args)&&)Args...); \
88 }
89
105#define UE_PROJECTION_MEMBER(Type, FuncName) \
106 [](auto&& Obj, auto&&... Args) -> decltype(auto) \
107 { \
108 return UE::Core::Private::DereferenceIfNecessary<Type>((decltype(Obj)&&)Obj, &Obj).FuncName((decltype(Args)&&)Args...); \
109 }
110
111namespace UE::Core::Private
112{
113 template <typename, typename FuncType, typename... ArgTypes>
115 {
116 };
117
118 template <typename FuncType, typename... ArgTypes>
119 struct TInvokeResult_Impl<decltype((void)Invoke(std::declval<FuncType>(), std::declval<ArgTypes>()...)), FuncType, ArgTypes...>
120 {
121 using Type = decltype(Invoke(std::declval<FuncType>(), std::declval<ArgTypes>()...));
122 };
123}
124
129template <typename FuncType, typename... ArgTypes>
130struct TInvokeResult : UE::Core::Private::TInvokeResult_Impl<void, FuncType, ArgTypes...>
131{
132};
133
134template <typename FuncType, typename... ArgTypes>
135using TInvokeResult_T = typename TInvokeResult<FuncType, ArgTypes...>::Type;
136
137#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_7
139#endif
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define AUTORTFM_INFER
Definition AutoRTFMDefines.h:121
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
AUTORTFM_INFER UE_FORCEINLINE_HINT constexpr auto Invoke(FuncType &&Func, ArgTypes &&... Args) -> decltype(((FuncType &&) Func)((ArgTypes &&) Args...))
Definition Invoke.h:44
typename TInvokeResult< FuncType, ArgTypes... >::Type TInvokeResult_T
Definition Invoke.h:135
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
typename TMemberFunctionPtrOuter< T >::Type TMemberFunctionPtrOuter_T
Definition MemberFunctionPtrOuter.h:27
Definition Core.Build.cs:8
Definition OverriddenPropertySet.cpp:45
implementation
Definition PlayInEditorLoadingScope.h:8
constexpr auto DereferenceIfNecessary(TargetType &&Target, const volatile OuterType *TargetPtr) -> decltype((TargetType &&) Target)
Definition Invoke.h:14
Definition AdvancedWidgetsModule.cpp:13
Definition Invoke.h:131
decltype(Invoke(std::declval< FuncType >(), std::declval< ArgTypes >()...)) Type
Definition Invoke.h:121