di 0.1.0
Loading...
Searching...
No Matches
variant_index.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/meta/core.h"
5#include "di/types/prelude.h"
6
7namespace di::vocab {
8namespace detail {
9 template<typename T>
10 concept MemberVariantIndex = requires(T const& variant) {
11 { variant.index() } -> concepts::SameAs<size_t>;
12 };
13
14 struct VariantIndexFunction {
15 template<typename T>
16 requires(concepts::TagInvocableTo<VariantIndexFunction, size_t, T const&> || MemberVariantIndex<T>)
17 constexpr auto operator()(T const& variant) const -> size_t {
18 if constexpr (concepts::TagInvocableTo<VariantIndexFunction, size_t, T const&>) {
19 return function::tag_invoke(*this, variant);
20 } else {
21 return variant.index();
22 }
23 }
24 };
25}
26
27constexpr inline auto variant_index = detail::VariantIndexFunction {};
28}
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition lazy.h:165
constexpr auto variant_index
Definition variant_index.h:27