如何传递具有模板数据类型的重载函数指针?
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)
{
// ...
}
旁注
- 您在调用
std::string::length
函数时有错字。
bool match(std::string x)
{
return x.length() <= 3; // missing () here
}
- 另外,看看
(Why is "using namespace std;" considered bad practice?)
在下面的代码中,我想创建一个函数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)
{
// ...
}
旁注
- 您在调用
std::string::length
函数时有错字。bool match(std::string x) { return x.length() <= 3; // missing () here }
- 另外,看看 (Why is "using namespace std;" considered bad practice?)