以函数为模板的C++函数指针
如何创建指向以模板为参数的函数的函数指针? 我试图创建一个指向此函数的指针以函数为模板的C++函数指针,c++,templates,pointers,function-pointers,C++,Templates,Pointers,Function Pointers,如何创建指向以模板为参数的函数的函数指针? 我试图创建一个指向此函数的指针 template<typename BaseType> int indexOfLargest(const BaseType list[], int startIndex, int endIndex) { if (startIndex < 0 || startIndex > endIndex) return -1; int indexOfMax = startInd
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;
}
这个函数呢
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]);
}
}
-另外,我无法在网上或从其他程序员那里找到任何答案
谢谢有几种方法。您可以让编译器为您解决:
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::函数
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);
// ...
}
}
有几种方法。您可以让编译器为您解决:
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::函数
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);
// ...
}
}
函数模板不是函数。不能形成指向函数模板的指针,也不能将指针作为参数传递给函数。然而,你似乎并不真的需要它来完成这项任务。你这么做
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)) { ...
函数模板不是函数。不能形成指向函数模板的指针,也不能将指针作为参数传递给函数。然而,你似乎并不真的需要它来完成这项任务。你这么做
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)) { ...
是否可以在函数中声明它?添加第三个带有局部函数变量的示例。虽然我不认为这将是一个巨大的性能改进,因为它为分支交易了一个间接过程。处理器非常擅长预测分支,因此我建议对其进行分析。所有这些都适用于C++11,但不适用于较旧的产品。第一个模板参数解决方案也适用于C++03,STL算法就是这样工作的。您可以在C++03上使用boost::function,而不是std::function,定义函数指针或使用模板参数的第一个版本,并使用调用它的顺序定义额外的重载。是否可以在函数中声明它?添加第三个带有局部函数变量的示例。虽然我不认为这将是一个巨大的性能改进,因为它为分支交易了一个间接过程。处理器非常擅长预测分支,因此我建议对其进行分析。所有这些都适用于C++11,但不适用于较旧的产品。第一个模板参数解决方案也适用于C++03,STL算法就是这样工作的。您可以在C++03上使用boost::function来代替std::function,定义一个函数指针,或者使用带有模板参数的第一个版本,并使用调用它的顺序定义一个额外的重载。