使用函数指针的代码无法编译?

时间:2019-12-31 06:46:59

标签: c++ templates function-pointers

我曾经在代码中使用模板,并且对其中一个模板的实例进行了实例化,但无法编译。 请问问题出在哪里

template<typename T>
bool matcher(const T& v1,const T& v2){
    if(v1==v2) return true;
    return false;
}

template<typename T1>
void compare(const T1* str1, const T1* str2, size_t size_m, bool(*)(const T1&,const T1&) func){
    for(size_t count{};count<size_m;count++)
        if(func(str1[count],str2[count]))
            std::cout<<"Mach at index of "<<count<<" is found\n";

}

int main(){


    compare("888888","98887",4,&matcher<char>);
    return 0;
}

我知道我应该使用std::function,但是我想尝试一下

1 个答案:

答案 0 :(得分:4)

compare()函数模板的参数列表中,函数指针声明中有一个错字。应该是

void compare(const T1* str1, const T1* str2, size_t size_m, bool(*func)(const T1&, const T1&) )
//                                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
   // ... code
}

要使功能指针的类型更具可读性,可以提供模板类型别名。

template<typename T1>  // template alias type
using FunctionPtrType = bool(*)(const T1&, const T1&);

template<typename T1>
void compare(const T1* str1, const T1* str2, size_t size_m, FunctionPtrType<T1> func)
//                                                          ^^^^^^^^^^^^^^^^^^^^^^^^
{
   // ... code
}

但是,为谓词提供一个更多的模板参数将减少类型输入,并且易于出错(IMO)。

template<typename T1, typename BinaryPredicate>
void compare(const T1* str1, const T1* str2, size_t size_m, BinaryPredicate func)
{
    // ... code
}