Your premise is a bit loaded. Although you can convert the old syntax for templates (for the same function templates, classes, variables, or aliases) by introducing a concept, in many cases it makes it artificial and passes the baton. Take the classic function template as std::transforman example:
template<typename In, typename Out, typename Func>
Out transform(In first, In last, Out out, Func func);
You can convert it to use the concept, and not in a very obvious way:
TransformParameters{In, Out, Func}
Out transform(In first, In last, Out out, Func func);
, , : , TransformParameters - ? . , - , / .
, std::transform ( , Im , ):
template<Iterator In, Iterator Out, Value Func>
requires
Callable<Func, iterator_reference_t<In>>
&& AssignableFrom<
iterator_reference_t<Out>,
result_of_t<Func(iterator_reference_t<In>)>
>
Out transform(In first, In last, Out out, Func func);
, , , std::transform *out = func(*in). , , -, , ( std::result_of_t ).
, . require , , iterator_reference_t<…> result_of_t<…>, (, It Iterator Callable).
, .. , ; . ( , .)