如何在 C++ 中将模板函数作为参数传递?

How to pass a template function as an argument in C++?

考虑一下:

template <class T_arr, class T_func>
void iter(T_arr *arr, int len, T_func func)
{
    for(int i = 0; i < len; i++)
    {
        func(arr[i]);
    }
}

void display(int a) {
    std::cout << "Hello, your number is: " << a << std::endl;
}

int main(void)
{    
    int arr[] = {1, 2, 3};

    iter(arr, 3, display);
    return (0);
}

这按预期工作,但是,如果我尝试将显示功能更改为模板:

template <class T>
void display(T a) {
    std::cout << "Hello, your number is: " << a << std::endl;
}

它停止工作,我收到此错误:候选模板被忽略:无法推断模板参数 'T_func'。

如何理解这一点?

您需要明确指定 display 的模板参数:

iter(arr, 3, display<int>);

或者让iter获取函数指针:

template <class T_arr>
void iter(T_arr *arr, int len, void (*func)(T_arr))
{
    for(int i = 0; i < len; i++)
    {
        func(arr[i]);
    }
}

那么你可以

iter(arr, 3, display); // template argument gets deduced as int