Если вы можете использовать хотя бы C ++ 11, вы можете исправить последние два параметра с помощью std::bind()
или, я предлагаю, с помощью лямбда-функции.
Так что вам не нужен параметр шаблона: вы можете передать результирующую лямбду в качестве аргумента func1()
и вызвать ее внутри.
Ниже приводится полный рабочий пример с лямбда
#include <iostream>
void foo (int a, int b)
{ std::cout << "foo: " << a << ", " << b << std::endl; }
void bar (int a, int b, int c, int d)
{ std::cout << "bar: " << a << ", " << b << ", " << c << ", "
<< d << std::endl; }
void func1 (void(*f)(int, int), int x, int y)
{ f(x, y); }
int main ()
{
auto l { [](int a, int b){ bar(a, b, 0, 0); } };
func1(foo, 1, 2);
func1(l, 3, 4);
}