20#if defined(_MSC_VER) || GUANAQO_GCC_OLDER_THAN(12)
27 template <
typename Tag,
typename... Args>
28 requires requires(Tag tag, Args &&...args) {
33 std::forward<Args>(args)...)))
35 std::forward<Args>(args)...)) {
52template <
typename Tag,
typename... Args>
57template <
typename Tag,
typename... Args>
59 tag_invocable<Tag, Args...> &&
requires(Tag tag, Args... args) {
62 std::forward<Args>(args)...)
66template <
typename Tag,
typename... Args>
69template <
typename Tag,
typename... Args>
73template <
typename Tag,
typename... Args>
77template <
typename Tag,
typename... Args>
82using tag_t = std::decay_t<
decltype(Tag)>;
Compiler feature detection helpers.
std::decay_t< decltype(Tag)> tag_t
constexpr bool is_nothrow_tag_invocable_v
constexpr tag_invoke_fn_ns::tag_invoke_fn guanaqo_tag_invoke
The tag_invoke customization point object.
std::invoke_result< decltype(::guanaqo::guanaqo_tag_invoke), Tag, Args... > tag_invoke_result
constexpr bool is_tag_invocable_v
std::invoke_result_t< decltype(::guanaqo::guanaqo_tag_invoke), Tag, Args... > tag_invoke_result_t
void guanaqo_tag_invoke()=delete
Poison pill to hide overloads of foo() that might be found in parent namespace.
constexpr auto operator()(Tag tag, Args &&...args) const noexcept(noexcept(guanaqo_tag_invoke(std::move(tag), std::forward< Args >(args)...))) -> decltype(guanaqo_tag_invoke(std::move(tag), std::forward< Args >(args)...))