【问题标题】:How to pass a template function as an argument in C++? [duplicate]如何在 C++ 中将模板函数作为参数传递? [复制]
【发布时间】:2022-01-24 02:50:50
【问题描述】:

考虑一下:

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”。

如何理解这一点?

【问题讨论】:

  • 当您致电iter(arr1, 3, display); 时,哪个 display 是什么意思? display&lt;int&gt;? display&lt;std::string&gt;? display&lt;double&gt;?编译器无法弄清楚“哦,T_func 应该接受T_arr 作为其参数,所以因为我已经推断出T_arr = int,我将尝试为T_func 实例化double&lt;int&gt;

标签: c++ templates arguments parameter-passing


【解决方案1】:

您需要为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

【讨论】:

  • 指定签名的扣分部分很棒!使用template &lt;class T_arr&gt; void iter(T_arr *arr, int len, void (*func)(T_arr) = display),它甚至可以作为默认值工作(如果之前已经定义了display模板)并且可以使用iter(arr, 3);调用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-21
  • 1970-01-01
相关资源
最近更新 更多