Есть ли способ иметь отдельные перегрузки функций шаблона для указателей и массивов?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли способ иметь отдельные перегрузки функций шаблона для указателей и массивов?

Сообщение Anonymous »

Во-первых, я хотел бы обратить особое внимание на тег C++20, так как считаю, что эту проблему гораздо проще решить, используя концепции и оператор require.
Во-вторых, когда я говорю здесь массив, я имею в виду 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»