如何对以模板作为参数的函数执行函数指针? 我正在尝试制作一个指向这个函数的指针
template<typename BaseType>
int indexOfLargest(const BaseType list[], int startIndex, int endIndex) {
if (startIndex < 0 || startIndex > endIndex)
return -1;
int indexOfMax = startIndex;
for (int index = startIndex + 1; index < endIndex; index++)
if (list[index] > list[indexOfMax])
indexOfMax = index;
return indexOfMax;
}
和这个功能
template<typename BaseType>
int indexOfSmallest(const BaseType list[], int startIndex, int endIndex) {
if (startIndex < 0 || startIndex > endIndex)
return -1;
int indexOfMin = startIndex;
for (int index = startIndex + 1; index < endIndex; index++)
if (list[index] < list[indexOfMin])
indexOfMin = index;
return indexOfMin;
}
所以我可以避免在每次迭代时都做一个if语句。
template<typename A0, typename A1, typename A2, typename A3, typename A4>
void sortArrayData(A0 a0[], A1 a1[], A2 a2[], A3 a3[], A4 a4[],
const int recordCount, int order) {
int indexOfNext;
for (int index = 0; index < recordCount - 1; index++) {
if (order == 1)
indexOfNext = indexOfSmallest(a0, index, recordCount);
else
indexOfNext = indexOfLargest(a0, index, recordCount);
swap_v(a0[index], a0[indexOfNext]);
swap_v(a1[index], a1[indexOfNext]);
swap_v(a2[index], a2[indexOfNext]);
swap_v(a3[index], a3[indexOfNext]);
swap_v(a4[index], a4[indexOfNext]);
}
}
- 另外我在网上或其他程序员身上找不到任何答案。
谢谢
答案 0 :(得分:3)
有几种方法。您可以让编译器为您解决:
template<typename A0, typename A1, typename A2, typename A3, typename A4, typename F>
void sortArrayData(A0 a0[],
A1 a1[],
A2 a2[],
A3 a3[],
A4 a4[],
const int recordCount,
F indexFunc)
{
int indexOfNext;
for (int index = 0; index < recordCount - 1; index++) {
indexOfNext = indexFunc(a0, index, recordCount);
// ...
}
}
或者您可以直接将签名指定为函数或std :: function。
template<typename A0, typename A1, typename A2, typename A3, typename A4>
void sortArrayData(A0 a0[],
A1 a1[],
A2 a2[],
A3 a3[],
A4 a4[],
const int recordCount,
std::function<int (A0, int, int)> indexFunc)
{
int indexOfNext;
for (int index = 0; index < recordCount - 1; index++) {
indexOfNext = indexFunc(a0, index, recordCount);
// ...
}
}
您还可以为函数声明一个局部变量:
template<typename A0, typename A1, typename A2, typename A3, typename A4>
void sortArrayData(A0 a0[],
A1 a1[],
A2 a2[],
A3 a3[],
A4 a4[],
const int recordCount,
int order)
{
std::function<int (A0, int, int)> indexFunc = (order == 1) ? (indexOfSmallest) : (indexOfSmallest);
int indexOfNext;
for (int index = 0; index < recordCount - 1; index++) {
indexOfNext = indexFunc(a0, index, recordCount);
// ...
}
}
答案 1 :(得分:3)
功能模板不是功能。您不能形成指向函数模板的指针,也不能将其作为参数传递给函数。但是,你似乎并不需要任何这项任务。你这样做
template<typename A0, typename A1, typename A2, typename A3, typename A4>
void sortArrayData(A0 a0[], A1 a1[], A2 a2[], A3 a3[], A4 a4[],
const int recordCount,
int (*func)(A0[], int, int)) { ...
然后只需传递indexOfLargest
或indexOfSmallest
,就像它是一个函数一样。系统将自动选择正确的实例化。一个简化的例子是这样的:
#include <iostream>
using namespace std;
template <class x> void xxx (x xx){cout << xx << endl; }
void foo(void (*f)(int)) {f(5);}
int main() {
foo(xxx);
return 0;
}