di 0.1.0
Loading...
Searching...
No Matches
type_name.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/meta/core.h"
6#include "di/reflect/field.h"
9
10namespace di::reflection {
11namespace detail {
12 template<typename T, typename M>
13 struct TypeName {};
14
15 template<typename T, typename M>
16 requires(requires { M::name; })
17 struct TypeName<T, M> {
18 constexpr static auto name = M::name;
19 };
20
21 template<typename T, typename A, typename M>
22 requires(requires { TypeName<T, meta::Reflect<T>>::name; })
23 struct TypeName<di::Box<T, A>, M> {
24 constexpr static auto subname = TypeName<T, meta::Reflect<T>>::name;
25 constexpr static auto name = container::fixed_string_concat(FixedString("Box<"), subname, FixedString(">"));
26 };
27}
28
29template<concepts::Reflectable T, typename M = Reflect<T>>
30requires(requires { detail::TypeName<meta::RemoveCVRef<T>, M>::name; })
31constexpr inline auto type_name = detail::TypeName<meta::RemoveCVRef<T>, M>::name;
32}
33
34namespace di {
36}
constexpr auto fixed_string_concat
Definition fixed_string.h:70
FixedString(char const (&)[size]) -> FixedString< size - 1 >
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
Definition atom.h:10
constexpr auto type_name
Definition type_name.h:31
Definition any_storable.h:9