Как передать перегруженный указатель на функцию с типом данных шаблона? - PullRequest
0 голосов
/ 25 мая 2020

В приведенном ниже коде я хочу создать функцию count, которая подсчитывает количество целых чисел / строк , которое квалифицирует критерии совпадения из вектора целых чисел / 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>) ) 

1 Ответ

0 голосов
/ 25 мая 2020

Тип указателя функции

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

Это означает, что вам нужно удалить лишнее <> из функции count, и вы можете go.

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)
{
   // ...
}

( См. Демонстрацию )


Примечания

...