Iros
 
Loading...
Searching...
No Matches
tag_invoke.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/meta/util.h"
5#include "di/util/declval.h"
6#include "di/util/forward.h"
7
8namespace di::function {
10 void tag_invoke() = delete;
11
12 struct TagInvokeFn {
13 template<typename Tag, typename... Args>
14 constexpr auto operator()(Tag tag, Args&&... args) const
15 -> decltype(tag_invoke(static_cast<Tag&&>(tag), static_cast<Args&&>(args)...)) {
16 return tag_invoke(static_cast<Tag&&>(tag), static_cast<Args&&>(args)...);
17 }
18 };
19}
20
21inline namespace tag_invoke_ns {
23}
24}
25
26namespace di::types {
27template<auto& T>
28using Tag = di::meta::Decay<decltype(T)>;
29}
30
31namespace di::concepts {
32template<typename Tag, typename... Args>
33concept TagInvocable =
34 requires(Tag tag, Args&&... args) { di::function::tag_invoke(tag, util::forward<Args>(args)...); };
35}
36
37namespace di::meta {
38template<typename Tag, typename... Args>
39requires(concepts::TagInvocable<Tag, Args...>)
41}
42
43namespace di::concepts {
44template<typename Tag, typename R, typename... Args>
46}
47
48namespace di {
53using types::Tag;
54}
Implicit conversion for this test refers to the ability to return a value of function from a type.
Definition operations.h:89
Definition tag_invoke.h:45
Definition tag_invoke.h:33
Definition any_storable.h:9
Definition tag_invoke.h:9
Definition tag_invoke.h:21
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition as_bool.h:8
Definition merge_interfaces.h:6
Conditional< concepts::LanguageArray< RemoveReference< T > >, RemoveExtent< RemoveReference< T > > *, Conditional< concepts::LanguageFunction< RemoveReference< T > >, AddPointer< RemoveReference< T > >, RemoveCVRef< T > > > Decay
Definition language.h:574
decltype(di::function::tag_invoke(util::declval< Tag >(), util::declval< Args >()...)) TagInvokeResult
Definition tag_invoke.h:40
Definition method.h:5
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
Definition zstring_parser.h:9
constexpr auto operator()(Tag tag, Args &&... args) const -> decltype(tag_invoke(static_cast< Tag && >(tag), static_cast< Args && >(args)...))
Definition tag_invoke.h:14