使用函数指针的代码无法编译
A code using pointer to function does not compile
我在我的代码中使用了两个模板和一个指向模板实例之一的指针。但它不编译。
我能知道问题出在哪里吗?
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
但我想试试这个。
在 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
}
我在我的代码中使用了两个模板和一个指向模板实例之一的指针。但它不编译。 我能知道问题出在哪里吗?
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
但我想试试这个。
在 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
}