Add invoke_r & co
This commit is contained in:
@ -54,6 +54,19 @@ constexpr auto invoke(is_func auto C::* f, auto&& self, Args&&... args)
|
|||||||
return ((*std::forward<decltype(self)>(self)).*f)(std::forward<Args>(args)...);
|
return ((*std::forward<decltype(self)>(self)).*f)(std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename R, typename F, typename... Args>
|
||||||
|
constexpr R invoke_r(F&& f, Args&&... args)
|
||||||
|
{
|
||||||
|
if constexpr (is_void<R>)
|
||||||
|
{
|
||||||
|
static_cast<void>(invoke(std::forward<F>(f), std::forward<Args>(args)...));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return invoke(std::forward<F>(f), std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template<typename Void, typename F, typename... Args>
|
template<typename Void, typename F, typename... Args>
|
||||||
struct _invoke_result_helper;
|
struct _invoke_result_helper;
|
||||||
|
|
||||||
@ -72,4 +85,8 @@ concept invocable = requires (F&& f, Args&&... args)
|
|||||||
invoke(std::forward<F>(f), std::forward<Args>(args)...);
|
invoke(std::forward<F>(f), std::forward<Args>(args)...);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename R, typename F, typename... Args>
|
||||||
|
concept invocable_r = invocable<F, Args...>
|
||||||
|
&& (is_void<R> || convertible_to<invoke_result_t<F, Args...>, R>);
|
||||||
|
|
||||||
} // namespace asl
|
} // namespace asl
|
||||||
|
@ -68,6 +68,9 @@ static_assert(asl::invocable<decltype(&HasMember::member), const HasMember2>);
|
|||||||
static_assert(asl::invocable<decltype(&HasMember::member), const HasMember&>);
|
static_assert(asl::invocable<decltype(&HasMember::member), const HasMember&>);
|
||||||
static_assert(asl::invocable<decltype(&HasMember::member), const HasMember2*>);
|
static_assert(asl::invocable<decltype(&HasMember::member), const HasMember2*>);
|
||||||
|
|
||||||
|
static_assert(asl::invocable_r<void*, int*()>);
|
||||||
|
static_assert(!asl::invocable_r<int*, void*()>);
|
||||||
|
|
||||||
ASL_TEST(invoke_member_function)
|
ASL_TEST(invoke_member_function)
|
||||||
{
|
{
|
||||||
HasFunction c;
|
HasFunction c;
|
||||||
@ -109,3 +112,9 @@ ASL_TEST(invoke_lambda)
|
|||||||
ASL_TEST_EXPECT(asl::invoke([](){ return 35; }) == 35);
|
ASL_TEST_EXPECT(asl::invoke([](){ return 35; }) == 35);
|
||||||
ASL_TEST_EXPECT(asl::invoke([](int x){ return x + 2; }, 6) == 8);
|
ASL_TEST_EXPECT(asl::invoke([](int x){ return x + 2; }, 6) == 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASL_TEST(invoke_r)
|
||||||
|
{
|
||||||
|
ASL_TEST_EXPECT(asl::invoke_r<int>([]() { return 1ULL; }) == 1);
|
||||||
|
asl::invoke_r<void>([]() { return 1ULL; });
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user