Iros
 
Loading...
Searching...
No Matches
enable_generate_structed_bindings.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/meta/algorithm.h"
5#include "di/meta/core.h"
7#include "di/util/forward.h"
11
12namespace di::vocab {
14 template<typename T>
15 constexpr auto operator()(types::InPlaceType<T> x) const {
16 if constexpr (concepts::TagInvocableTo<EnableGenerateStructedBindingsFunction, bool, decltype(x)>) {
17 return function::tag_invoke(*this, x);
18 } else {
19 return false;
20 }
21 }
23}
24
25namespace di::concepts::detail {
26template<typename T, typename Indices>
28
29template<typename T, types::size_t index>
30concept HasMemberGet = requires(T value) { util::forward<T>(value).template get<index>(); };
31
32template<typename T, types::size_t... indices>
33struct CanStructuredBindHelper<T, meta::ListV<indices...>> {
34 constexpr static bool value = (HasMemberGet<T, indices> && ...);
35};
36
37template<typename T>
41}
42
43// Include the generate structed bindings here, so
44// that any type which does enable structed bindings will have those
45// declarations immediately.
46namespace std {
47template<di::concepts::detail::CanStructuredBind T>
48struct tuple_size<T> {
50};
51
52template<di::types::size_t index, di::concepts::detail::CanStructuredBind T>
53struct tuple_element<index, T> {
55};
56}
Definition core.h:114
Definition tag_invoke.h:45
Definition tuple_like.h:38
Definition enable_generate_structed_bindings.h:38
Definition enable_generate_structed_bindings.h:30
Definition impl.h:7
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition merge_interfaces.h:6
constexpr auto TupleSize
Definition tuple_size.h:23
RemoveConst< RemoveVolatile< T > > RemoveCV
Definition core.h:57
decltype(vocab::tuple_element(types::in_place_type< meta::RemoveReference< T > >, c_< index >))::Type TupleElement
Definition tuple_element.h:21
constexpr auto in_place_type
Definition in_place_type.h:12
std::size_t size_t
Definition size_t.h:12
Definition lazy.h:165
constexpr struct di::vocab::EnableGenerateStructedBindingsFunction enable_generate_structed_bindings
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
Definition enable_generate_structed_bindings.h:46
Definition enable_generate_structed_bindings.h:27
static constexpr bool value
Definition enable_generate_structed_bindings.h:34
Definition in_place_type.h:5
Definition enable_generate_structed_bindings.h:13
constexpr auto operator()(types::InPlaceType< T > x) const
Definition enable_generate_structed_bindings.h:15
di::meta::TupleElement< T, index > type
Definition enable_generate_structed_bindings.h:54
static constexpr di::types::size_t value
Definition enable_generate_structed_bindings.h:49