2014-04-14 134 views
1

如何做一个函数指针指向以模板为参数的函数? 我试图做一个指向该函数C++函数指针函数,需要模板作为参数

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]); 
    } 

} 

- 另外我无法找到这个网上或老乡程序员任何答案。

谢谢

回答

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); 
     // ... 
    } 
} 
+0

是否有可能在函数中声明它? – zeitue

+0

用本地函数变量添加第三个示例。虽然我认为这不会是一个巨大的性能提升,因为它对分支有着间接的影响。处理器在预测分支方面非常出色,所以我建议对其进行配置。 – Jens

+0

那么所有这一切都适用于C++ 11,但不适用于较旧的东西 – zeitue

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

,然后就通过indexOfLargestindexOfSmallest,仿佛它是一个函数。系统将自动选择正确的实例。一个简单的例子是这样的:

#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; 
}