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

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
}