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