1 #pragma once 2 3 #include <concepts> 4 #include <type_traits> 5 6 namespace lg2::details 7 { 8 9 /** Matches a type T which is anything except one of those in Ss. */ 10 template <typename T, typename... Ss> 11 concept any_but = (... && !std::convertible_to<T, Ss>); 12 13 /** Determine if a type might be a constexpr string: (const char (&)[N]) */ 14 template <typename T> 15 concept maybe_constexpr_string = std::is_array_v<std::remove_cvref_t<T>> && 16 std::same_as<const char*, std::decay_t<T>>; 17 18 /** Determine if a type is certainly not a constexpr string. */ 19 template <typename T> 20 concept not_constexpr_string = (!maybe_constexpr_string<T>); 21 22 }; // namespace lg2::details 23