agree with this direction
i wonder if it may be even cleaner to keep the bool exclusion itself as the reusable/composable concept, instead of coupling it directly into non_bool_integral.
sth like:
template <typename T>
concept not_bool =
!std::same_as<std::remove_cvref_t<T>, bool>;
then compose it where needed, for instance:
requires std::integral<T> && not_bool<T>
the reason i slightly prefer this direction is that not_bool feels like an orthogonal semantic property rather than something inherently tied to integrals specifically.
it also scales a bit better compositionally since some call sites may only care about excluding bool, while others may want combinations like:
std::unsigned_integral<T> && not_bool<T>
or other constraints later on.
that way the concepts can stay small and reusable, while the constraints read closer to their actual intent.
keen to hear what you think about this approach.