Может ли имя параметра шаблона шаблона функции использоваться более одного раза в списке параметров функции? - PullRequest
1 голос
/ 20 марта 2019

Я сделал эту функцию для специального использования на 2-мерных массивах квадратичной формы: rowLength == colLength

Если вы передадите прямоугольный массив, функция потерпит неудачу, потому что реализация не подходит для прямоугольных форм: rowLength != colLength

Использование только одного шаблона гарантирует, что массив является квадратичным.Пусть компилятор предупреждает вас о прямоугольнике, потому что параметры должны быть равны, чтобы «удовлетворить» систему шаблонов.

Я знаю, что будут другие решения, но это будет именно то, что я хотел.

template <std::size_t sideLength>
void functionForQuadraticArrayOnly( const int( &arr )[ sideLength ][ sideLength ] )
{// body....}

Вопрос: правильно ли использовать этот шаблон?Это неопределенное поведение или что-то еще?

1 Ответ

0 голосов
/ 20 марта 2019

То, что вы делаете здесь, безопасно. Однако было бы хорошо знать об одном особом случае, упомянутом в стандарте.

Рассмотрим следующий пример:

typedef int N;
template<N X, typename N, template<N Y> class T> struct A;

Здесь X - это параметр шаблона нетипового типа типа int, а Y - это параметр шаблона нетипичного типа того же типа, что и второй параметр шаблона A.

Обратите внимание, что Y является , а не нетипизированным параметром шаблона типа int, поскольку параметр шаблона N скрывает N typedef.

Это согласно [basic.scope.temp]/4], которое гласит:

Декларативная область имени параметра шаблона вложена в непосредственно включающую декларативную область. [Примечание: в результате параметр-шаблон скрывает любую сущность с таким же именем в прилагаемой области видимости]

...