Указатель функции является нетиповым параметром шаблона.
template <auto F = &foo> // c++17
template <void(*F)() = &foo>
Вот полный пример:
#include <iostream>
void foo() { std::puts("foo"); }
void bar() { std::puts("bar"); }
template <void (*F)() = &foo>
struct Foo {
void exec() { F(); }
};
int main() {
Foo a;
Foo<&bar> b;
a.exec(); // prints "foo"
b.exec(); // prints "bar"
}
Если вам нужно сохранить По какой-то причине указатель на функцию (как вы сделали в своем фрагменте), вы можете сделать это, объявив decltype(F) f = F;
членом класса.