以函数为模板的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,定义一个函数指针,或者使用带有模板参数的第一个版本,并使用调用它的顺序定义一个额外的重载。