我曾经在代码中使用模板,并且对其中一个模板的实例进行了实例化,但无法编译。 请问问题出在哪里
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
,但是我想尝试一下
答案 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
}