如何传递具有模板数据类型的重载函数指针?

How to pass a overloaded function pointer with a template data type?

在下面的代码中,我想创建一个函数count来计算integers/strings的数量它符合 integers/strings.

向量的匹配条件

但是我不清楚函数定义怎么写

#include <iostream>
#include <vector>
using namespace std;

bool match(int x) {
    return (x % 2 == 0);
}

bool match(string x) {
    return (x.length <= 3);
}

template <typename T>
int count(vector<T>& V, bool (*test)(<T>))
{
    int tally = 0;
    for (int i = 0; i < V.size(); i++) {
        if (test(V[i])) {
            tally++;
        }
    }
    return tally;
}

int main() 
{
    vector <int> nums;
    vector <string> counts;
    nums.push_back(2);
    nums.push_back(4);
    nums.push_back(3);
    nums.push_back(5);
    counts.push_back("one");
    counts.push_back("two");
    counts.push_back("three");
    counts.push_back("four");
    cout << count(nums, match) << endl;
    cout << count(counts, match) << endl;
}

原型应该怎么写?我意识到错误在行

int count (vector<T> &V , bool (*test)(<T>) ) 

函数指针类型为

<return-type>(*function-pointer-identifier)(<argument-types>)<other specifiers>

意思是,您需要从 count 函数中删除多余的 <>,然后就可以开始了。

template <typename T>
int count(std::vector<T>& V, bool (*test)(T))
//                           ^^^^^^^^^^^^^^^^^

或者您可以为函数指针类型提供模板类型别名,这可能更易于阅读

template <typename T>
using FunPtrType = bool (*)(T); // template alias

template <typename T>
int count(std::vector<T>& V, FunPtrType<T> test)
{
   // ...
}

(See a demo)


旁注

  • 您在调用 std::string::length 函数时有错字。
    bool match(std::string x)
    {
       return x.length() <= 3; // missing () here
    }
    
  • 另外,看看 (Why is "using namespace std;" considered bad practice?)