What's wrong with that (sorry for the terrible name):

template<typename T, typename... Us>
concept any_of = (std::is_same_v<T, Us> || ...);

void f(any_of<char, uint8_t> auto x);

template<any_of<char, uint8_t> T>
void f(std::basic_string<T> x);

?

No series of is_same_v needed and you can reuse it, so no need for inventing weird names if you are worried about that...

Sebastian

On 04.03.20 15:12, Michał Piotr Gawron via Std-Proposals wrote:
On 04.03.2020 15:03, Михаил Найденов wrote:
Well,

template<class T>
concept charOrUInt8 = std::is_same_v<char> || std::is_same_v<uint8_t>;

void f (charOrUInt8 auto x);

template<charOrUInt8 T>
void f (std::basic_string<T> x)

Close enough, if ask me :)
That still requires writing a series of std::is_same_v<> but this time
I'd also have to invent a name for the concept. I'd like to avoid that
and keep the actual list of types right in the arguments list. Of
course, if I wanted to reuse the allowed types list, I'd use a concept.