fix(templates): fix Invoke selects the wrong operation when the function has specifiers

This commit is contained in:
_Redstone_c_ 2022-04-07 14:52:41 +08:00
parent a539f70535
commit 988e0335a0

View File

@ -14,7 +14,7 @@ struct InvokeFunction
template <typename F, typename... Types>
static auto Invoke(F&& Object, Types&&... Args)
{
return Object(Forward<Types>(Args)...);
return Forward<F>(Object)(Forward<Types>(Args)...);
}
};
@ -22,16 +22,16 @@ struct InvokeMemberFunction
{
template <typename F, typename ObjectType, typename... Types>
static auto Invoke(F&& Func, ObjectType&& Object, Types&&... Args) ->
decltype((Object->*Func)(Forward<Types>(Args)...))
decltype((Forward<ObjectType>(Object)->*Func)(Forward<Types>(Args)...))
{
return (Object->*Func)(Forward<Types>(Args)...);
return (Forward<ObjectType>(Object)->*Func)(Forward<Types>(Args)...);
}
template <typename F, typename ObjectType, typename... Types>
static auto Invoke(F&& Func, ObjectType&& Object, Types&&... Args) ->
decltype((Object.*Func)(Forward<Types>(Args)...))
decltype((Forward<ObjectType>(Object).*Func)(Forward<Types>(Args)...))
{
return (Object.*Func)(Forward<Types>(Args)...);
return (Forward<ObjectType>(Object).*Func)(Forward<Types>(Args)...);
}
};
@ -39,16 +39,16 @@ struct InvokeMemberObject
{
template <typename F, typename ObjectType>
static auto Invoke(F&& Func, ObjectType&& Object) ->
decltype(Object->*Func)
decltype(Forward<ObjectType>(Object)->*Func)
{
return (Object->*Func);
return (Forward<ObjectType>(Object)->*Func);
}
template <typename F, typename ObjectType>
static auto Invoke(F&& Func, ObjectType&& Object) ->
decltype(Object.*Func)
decltype(Forward<ObjectType>(Object).*Func)
{
return (Object.*Func);
return (Forward<ObjectType>(Object).*Func);
}
};
@ -81,6 +81,7 @@ NAMESPACE_PRIVATE_END
template <typename F, typename... Types> requires TIsInvocable<F, Types...>::Value
constexpr auto Invoke(F&& Func, Types&&... Args)
-> decltype(NAMESPACE_PRIVATE::InvokeImpl<F, Types...>::Invoke(Forward<F>(Func), Forward<Types>(Args)...))
{
return NAMESPACE_PRIVATE::InvokeImpl<F, Types...>::Invoke(Forward<F>(Func), Forward<Types>(Args)...);
}