#pragma once #include "inc.h" #include "Decay.h" #include "PointerIsConvertibleFromTo.h" #include "EnableIf.h" namespace UE4Invoke_Private { template FORCEINLINE auto DereferenceIfNecessary(CallableType&& Callable) -> typename TEnableIf::Type, typename TDecay::Type>::Value, decltype((CallableType&&)Callable)>::Type { return (CallableType&&)Callable; } template FORCEINLINE auto DereferenceIfNecessary(CallableType&& Callable) -> typename TEnableIf::Type, typename TDecay::Type>::Value, decltype(*(CallableType&&)Callable)>::Type { return *(CallableType&&)Callable; } } template FORCEINLINE auto Invoke(FuncType&& Func, ArgTypes&&... Args) -> decltype(Forward(Func)(Forward(Args)...)) { return Forward(Func)(Forward(Args)...); } template FORCEINLINE auto Invoke(ReturnType ObjType::* pdm, CallableType&& Callable) -> decltype(UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*pdm) { return UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*pdm; } template FORCEINLINE auto Invoke(ReturnType(ObjType::* PtrMemFun)(PMFArgTypes...), CallableType&& Callable, ArgTypes&&... Args) -> decltype((UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*PtrMemFun)(Forward(Args)...)) { return (UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*PtrMemFun)(Forward(Args)...); } template FORCEINLINE auto Invoke(ReturnType(ObjType::* PtrMemFun)(PMFArgTypes...) const, CallableType&& Callable, ArgTypes&&... Args) -> decltype((UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*PtrMemFun)(Forward(Args)...)) { return (UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*PtrMemFun)(Forward(Args)...); }