Во-вторых, когда я говорю здесь массив, я имею в виду int a[3], у меня уже есть рабочая перегрузка, которая обрабатывает «обычные» контейнеры std, включая array b (другой для контейнеров, подобных карте, и еще один для контейнеров, подобных очередям).
У меня есть большая функция с большим количеством перегрузок для обработки различных использует новые концепции и требует ключевого слова, чтобы каждая перегрузка обрабатывала как можно больше типов.
Я не могу найти способ правильно различать массивы и указатели. Мне нужен способ, который бы никогда не ошибочно классифицировал указатели как массивы, но если некоторые массивы классифицируются как указатели, это не конец света (в частности, если массив имеет только один элемент, вообще не имеет значения, какой из них классифицируется). as).
Этот ответ близок, но он не работает для этого общего случая, когда я не знаю, что представляет собой массив/на что находится указатель.
Сейчас я использую это для массивов:
Код: Выделить всё
template requires(requires(T& a){1[a];}
&& !requires(T& a){a.begin();}
&& !is_convertible_v
)
string function(const T& v);
Код: Выделить всё
template requires(is_pointer_v
&& !requires(T& a){1[a];}
&& !is_convertible_v
)
string function(T v);
Я бы подумал, что Здесь подойдет is_array_v ; Если я добавлю его в свои требования к массиву и заменю !requires(T& a){1[a]; на !is_array_v в своих требованиях к указателям, тогда указатели будут работать как положено, но Я получаю неоднозначную ошибку перегрузки для массивов, поскольку она неявно приводит ее к указателю. У меня сложилось впечатление, что неявное приведение типов не работает при создании экземпляров шаблонов.
Подробнее здесь: https://stackoverflow.com/questions/783 ... rs-and-arr