Функция передана как аргумент шаблона

Я ищу правила передачи функций шаблонов C ++ в качестве аргументов.

Это поддерживается C ++, как показано на примере здесь:

#include <iostream>

void add1(int &v)
{
  v+=1;
}

void add2(int &v)
{
  v+=2;
}

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

int main()
{
  doOperation<add1>();
  doOperation<add2>();
}

Однако узнать об этой технике сложно.Поиск в Google в качестве аргумента шаблона & quot; не приводит к многим. И классическийШаблоны C ++ Полное руководство на удивление, также не обсуждает это (по крайней мере, не из моих поисков).

У меня есть вопросы, является ли это допустимым C ++ (или просто некоторым широко поддерживаемым расширением).

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

Следующее делаетnot работать в вышеуказанной программе, по крайней мере, вVisual C ++потому что синтаксис явно неправильный. Было бы хорошо иметь возможность переключать функцию для функтора и наоборот, аналогично тому, как вы можете передавать указатель функции или функтор в алгоритм std :: sort, если вы хотите определить пользовательскую операцию сравнения.

   struct add3 {
      void operator() (int &v) {v+=3;}
   };
...

    doOperation<add3>();

Будем признательны за указатели на одну или две веб-ссылки или страницу в книге шаблонов C ++!

Ответы на вопрос(6)

Ваш ответ на вопрос