如何将模板函数作为模板函数的参数传递?

时间:2019-09-28 01:36:34

标签: c++ templates

我想将模板函数作为模板函数的参数传递。在以下代码的“ meta_func_ok”函数中,已成功将函数指针作为模板函数的参数传递。但是作为模板,

template    < typename N >  N
meta_func_ok( N( *f )( N ), N x ) {
    return f( x );
}

template    < typename F, typename N >  N
meta_func_ng( F f, N x ) {
    return f( x );
}

template    < typename N >  N
target_func( N x ) {
    return x;
}

int main() {
    meta_func_ok( target_func, 1 );
    meta_func_ng( target_func, 1 );     // LINE 18
    return 0;
}

编译此代码会在下面产生错误。

  

ng.cpp:在函数'int main()'中:ng.cpp:18:31:错误:无匹配项   调用“ meta_func_ng(,int)” meta_func_ng(target_func,1)的函数;                                  ^ ng.cpp:7:1:注意:候选:模板N meta_func_ng(F,N)meta_func_ng(F f,N   x){^ ~~~~~~~~~~~ ng.cpp:7:1:注意:模板参数   推论/替代失败:ng.cpp:18:31:注意:无法推论   模板参数“ F” meta_func_ng(target_func,1);

我该怎么办?预先感谢!

1 个答案:

答案 0 :(得分:2)

编译器对类型推断的支持不完善。在第二种情况(meta_func_ng中,N类型是根据自变量1来推断的,但是无法从F来推断target_func,因为您没有指定target_func的{​​{1}}类型参数的显式类型(编译器不足以知道N的{​​{1}}与{{1}相同} s meta_func_ng)。

这很好,但是:

N

请参阅此质量检查:When a compiler can infer a template parameter?