Я ищу правила, связанные с передачей функций шаблонов С++ в качестве аргументов.
Это поддерживается С++, как показано на примере:
#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>();
}
Изучение этой техники сложно. Googling для функции как аргумент шаблона не приводит к большому количеству. И классический С++ Templates The Complete Guide неожиданно также не обсуждает его (по крайней мере, не из моего поиска).
У меня есть вопросы: действительно ли это С++ (или просто какое-то широко распространенное расширение).
Кроме того, существует ли способ, чтобы функтор с одной и той же сигнатурой использовался взаимозаменяемо с явными функциями во время такого вызова шаблона?
В приведенной выше программе работает не, по крайней мере, в Visual С++, потому что синтаксис, очевидно, неправильно. Было бы неплохо включить функцию для функтора и наоборот, аналогично тому, как вы можете передать указатель на функцию или функтор в алгоритм std:: sort, если вы хотите определить пользовательскую операцию сравнения.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
Указатели на веб-ссылку или две или страницу в книге шаблонов С++ будут оценены!