Смотрю описание шаблонов и заметил, что имена параметров везде помечены как необязательные, но ведь если имя отсутствует, то параметр внутри функции я использовать не смогу. Получается, что я могу объявить и вызвать такую функцию (https://ideone.com/VVicO8):
template <int> void f() {}
Но все версии этой функции будут одинаковы между собой - тогда зачем мне вообще параметр шаблона? Есть ли реальная пользя от возможности не указывать имя и создавать нечто подобное? Зачем вообще эта возможность заложена в стандарт?
Тема неиспользуемых аргументов в шаблонах классов уже поднималась: шаблонный класс, не использующий аргумент шаблона
В вашем конкретном примере - шаблон функции - использование фиктивного неименованного параметра может служить какой-то специальной внутренней более-менее экзотической технической цели.
Например, вам по какой-то причине необходимо иметь возможность генерировать копии одной и той же функции (т.е. делающие одно и то же), но при этом обладающие разной "адресной идентичностью", т.е. имеющие разные адреса
assert(&f<1> != &f<2>);
Не понимаю, почему вы решили, что все версии функции будут одинаковы. Отсутствие имени всего лишь означает, что параметр не используется, но это вовсе не значит, что f<7>
это та же самая функция, что и f<5>
, например. В частности можно сделать специализацию, которая будет делать что-то особенное, исходя из значения шаблонного аргумента:
#include <iostream>
template <int>
void f() {}
template <>
void f<7>() {
std::cout << "seven\n";
}
int main()
{
f<7>();
return 0;
}
Немного перефразирую вопрос: Имеется ли смысл иметь в шаблоне параметр, который в этом шаблоне затем никак не используется? (Потому что опускать имя - это потеря семантики.)
Для этого есть масса сценариев:
template <typename x_Tag, typename x_Type> class t_StrongTypedef
(x_Tag
никак не используется, код от x_Tag
не зависит, параметр задается пользователем)int x_group_size
2/4/8. (x_group_size
никак не используется, но код от x_group_size
зависит, параметр задается пользователем)typename x_Enabled = ::std::enable_if_t<
(x_Enabled
никак не используется (и как раз часто опускается), код от x_Enabled
не зависит, параметр может принимать только значение void
и никогда не задается пользователем)typename x_Unused = void
. (x_Unused
никак не используется, код от x_Unused
не зависит, параметр может принимать только значение void
и никогда не задается пользователем)Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть функция поиска, но при сравнивании строки с помощью этой функции, strcmp(mas[ii]street,pt), и тут возникла проблема, строка которую ввожу,...
Такой вопрос, я добавляю динамически на форму следующие компоненты: