allow non-static methods to be bound to Function
This commit is contained in:
parent
462e6f0659
commit
70a2b88898
|
@ -571,16 +571,11 @@ namespace detail {
|
||||||
return !!f;
|
return !!f;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename F, typename ...A>
|
|
||||||
inline auto func_invoke_helper(F &&f, A &&...args) {
|
|
||||||
return forward<F>(f)(forward<A>(args)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename R>
|
template<typename R>
|
||||||
struct FuncInvokeVoidReturnWrapper {
|
struct FuncInvokeVoidReturnWrapper {
|
||||||
template<typename ...A>
|
template<typename ...A>
|
||||||
static R call(A &&...args) {
|
static R call(A &&...args) {
|
||||||
return func_invoke_helper(forward<A>(args)...);
|
return func_invoke(forward<A>(args)...);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -588,7 +583,7 @@ namespace detail {
|
||||||
struct FuncInvokeVoidReturnWrapper<void> {
|
struct FuncInvokeVoidReturnWrapper<void> {
|
||||||
template<typename ...A>
|
template<typename ...A>
|
||||||
static void call(A &&...args) {
|
static void call(A &&...args) {
|
||||||
func_invoke_helper(forward<A>(args)...);
|
func_invoke(forward<A>(args)...);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1452,7 +1452,24 @@ namespace detail {
|
||||||
|
|
||||||
#define OSTD_FWD(T, _v) static_cast<T &&>(_v)
|
#define OSTD_FWD(T, _v) static_cast<T &&>(_v)
|
||||||
template<typename ...A>
|
template<typename ...A>
|
||||||
auto func_invoke(InvokeAny, A &&...) -> InvokeNat;
|
inline auto func_invoke(InvokeAny, A &&...) -> InvokeNat;
|
||||||
|
|
||||||
|
/* forward declarations, later defined in functional */
|
||||||
|
template<
|
||||||
|
typename F, typename T, typename ...A,
|
||||||
|
typename = EnableIf<
|
||||||
|
IsMemberFunctionPointer<RemoveReference<F>> &&
|
||||||
|
IsBaseOf<
|
||||||
|
RemoveReference<MemberPointerClass<RemoveReference<F>>>,
|
||||||
|
RemoveReference<T>
|
||||||
|
>
|
||||||
|
>
|
||||||
|
>
|
||||||
|
inline auto func_invoke(F &&f, T &&v, A &&...args) ->
|
||||||
|
decltype((OSTD_FWD(T, v).*f)(OSTD_FWD(A, args)...))
|
||||||
|
{
|
||||||
|
return (OSTD_FWD(T, v).*f)(OSTD_FWD(A, args)...);
|
||||||
|
}
|
||||||
|
|
||||||
template<
|
template<
|
||||||
typename F, typename T, typename ...A,
|
typename F, typename T, typename ...A,
|
||||||
|
@ -1464,21 +1481,11 @@ namespace detail {
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
auto func_invoke(F &&f, T &&v, A &&...args) ->
|
inline auto func_invoke(F &&f, T &&v, A &&...args) ->
|
||||||
decltype((OSTD_FWD(T, v).*f)(OSTD_FWD(A, args)...));
|
decltype(((*OSTD_FWD(T, v)).*f)(OSTD_FWD(A, args)...))
|
||||||
|
{
|
||||||
template<
|
return ((*OSTD_FWD(T, v)).*f)(OSTD_FWD(A, args)...);
|
||||||
typename F, typename T, typename ...A,
|
}
|
||||||
typename = EnableIf<
|
|
||||||
IsMemberFunctionPointer<RemoveReference<F>> &&
|
|
||||||
IsBaseOf<
|
|
||||||
RemoveReference<MemberPointerClass<RemoveReference<F>>>,
|
|
||||||
RemoveReference<T>
|
|
||||||
>
|
|
||||||
>
|
|
||||||
>
|
|
||||||
auto func_invoke(F &&f, T &&v, A &&...args) ->
|
|
||||||
decltype(((*OSTD_FWD(T, v)).*f)(OSTD_FWD(A, args)...));
|
|
||||||
|
|
||||||
template<
|
template<
|
||||||
typename F, typename T,
|
typename F, typename T,
|
||||||
|
@ -1490,7 +1497,9 @@ namespace detail {
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
auto func_invoke(F &&f, T &&v) -> decltype(OSTD_FWD(T, v).*f);
|
inline auto func_invoke(F &&f, T &&v) -> decltype(OSTD_FWD(T, v).*f) {
|
||||||
|
return OSTD_FWD(T, v).*f;
|
||||||
|
}
|
||||||
|
|
||||||
template<
|
template<
|
||||||
typename F, typename T,
|
typename F, typename T,
|
||||||
|
@ -1502,11 +1511,16 @@ namespace detail {
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
auto func_invoke(F &&f, T &&v) -> decltype((*OSTD_FWD(T, v)).*f);
|
inline auto func_invoke(F &&f, T &&v) -> decltype((*OSTD_FWD(T, v)).*f) {
|
||||||
|
return (*OSTD_FWD(T, v)).*f;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename F, typename ...A>
|
template<typename F, typename ...A>
|
||||||
auto func_invoke(F &&f, A &&...args) ->
|
inline auto func_invoke(F &&f, A &&...args) ->
|
||||||
decltype(OSTD_FWD(F, f)(OSTD_FWD(A, args)...));
|
decltype(OSTD_FWD(F, f)(OSTD_FWD(A, args)...))
|
||||||
|
{
|
||||||
|
return OSTD_FWD(F, f)(OSTD_FWD(A, args)...);
|
||||||
|
}
|
||||||
#undef OSTD_FWD
|
#undef OSTD_FWD
|
||||||
|
|
||||||
template<typename F, typename ...A>
|
template<typename F, typename ...A>
|
||||||
|
|
Loading…
Reference in a new issue