Является ли шаблон синтаксиса в C ++ просто шаблоном? - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь понять это Функция передана в качестве аргумента шаблона .Оказывается, в некоторых местах, которые я читал о шаблонах, вы объявляете их так:

template <typename MyTypeName>
class ...

Теперь, что точно означает

template <void (*T)(int &)>

?Это больше похоже на вопрос о синтаксисе , чем о том, что делает код.Как я понял, он создает шаблонную функцию, которая принимает указатель на функцию, и эта функция получает ссылку на целое число в качестве аргумента.

Однако я не думаю, что это соответствует синтаксису шаблонов.Где ключевое слово typename?Каков общий синтаксис шаблона?

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

template <arguments>

, где аргументами могут быть вещи типа: typename T, int N, void T(int) и так далее.Если это так, в чем преимущество определения

template <void (*T)(int &)>
void doOperation()
{
  int temp=0;
  T(temp);
  std::cout << "Result is " << temp << std::endl;
}

, например, вместо

void doOperation(void (*T)(int &))
{
  int temp=0;
  T(temp);
  std::cout << "Result is " << temp << std::endl;
}

?

1 Ответ

0 голосов
/ 24 октября 2018

Является ли синтаксис шаблона в c ++ просто template <typename T>?

Нет.Существует три типа параметров шаблона ,

  • нетипичный параметр шаблона;
  • параметр шаблона типа;
  • шаблонпараметр шаблона.

Ключевое слово typename необходимо для объявления типа шаблона параметра , а ключевые слова template и typename необходимы для объявления шаблон шаблона параметра .Учитывая, что template <void (*T)(int &)>, T объявлен как параметр шаблона нетипичного типа (указатель на функцию).

И почему бы просто не сделать void doOperation(void (*T)(int &)), потому что мы должны объявить T как параметр шаблона , иначе это будет просто имя параметра функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...