Fix counter in gcc

This commit is contained in:
sha512sum 2024-04-22 17:10:31 +00:00
parent 59d590745c
commit 94c6f53b4f
2 changed files with 20 additions and 7 deletions

View file

@ -1,3 +1,4 @@
#include <type_traits>
#pragma once #pragma once
namespace utempl::loopholes { namespace utempl::loopholes {
@ -12,8 +13,18 @@ struct Injector {
}; };
template <auto I, typename...> template <auto, typename = void, typename... Ts>
concept Injected = requires{Magic(Getter<I>{});}; struct InjectedImpl {
static constexpr bool value = false;
};
template <auto V, typename... Ts>
struct InjectedImpl<V, std::void_t<decltype(Magic(Getter<V>{}))>, Ts...> {
static constexpr bool value = true;
};
template <auto I, typename... Ts>
concept Injected = InjectedImpl<I, void, Ts...>::value;

View file

@ -7,15 +7,15 @@ namespace utempl::loopholes {
namespace impl { namespace impl {
template <typename Tag, auto Value> template <typename Tag, auto Value>
struct TagWithTalue {}; struct TagWithValue {};
template <auto I = 0, typename Tag, typename... Ts, auto = Injector<TagWithTalue<Tag, I>{}>{}> template <auto I = 0, typename Tag, typename... Ts, auto = Injector<TagWithValue<Tag, I>{}>{}>
constexpr auto Counter(...) { constexpr auto Counter(...) {
return I; return I;
}; };
template <auto I = 0, typename Tag, typename... Ts> template <auto I = 0, typename Tag, typename... Ts>
consteval auto Counter(std::size_t arg) requires Injected<TagWithTalue<Tag, I>{}, Ts...> { consteval auto Counter(std::size_t arg) requires Injected<TagWithValue<Tag, I>{}, Ts...> {
return Counter<I + 1, Tag, Ts...>(arg); return Counter<I + 1, Tag, Ts...>(arg);
}; };
} // namespace impl; } // namespace impl;
@ -24,12 +24,14 @@ consteval auto Counter(std::size_t arg) requires Injected<TagWithTalue<Tag, I>{}
template < template <
typename Tag, typename Tag,
typename... Ts, typename... Ts,
std::size_t R = impl::Counter<0, Tag, Ts...>(std::size_t{}) - 1 std::size_t R = impl::Counter<0, Tag, Ts...>(std::size_t{})
#if defined __clang__
- 1
#endif
> >
consteval auto Counter(auto...) -> std::size_t { consteval auto Counter(auto...) -> std::size_t {
return R; return R;
}; };
} // namespace utempl::loopholes } // namespace utempl::loopholes