qsort() 函数可以与函数模板一起用作比较器吗?

Can the qsort() function be used with a function template as the comparator?

我正在尝试创建一个接收数组作为输入并对其进行排序的函数模板。为了对其进行排序,我想我可以使用 C++ 标准库的头文件 cstdlib 中包含的 qsort() 函数。 qsort() 函数需要一个比较器函数作为参数传递,在本例中它也需要是一个函数模板。

不幸的是,我根本无法让它工作。如果比较器函数不是函数模板,程序编译成功,但如果是,我得到一个错误

no matches converting function ‘compare2’ to type ‘__compar_fn_t {aka int (*)(const void*, const void*)}’

为了让您了解我在说什么,这里有一个例子:

#include <cstdlib>

using namespace std;

int compare2(const void *pa, const void *pb)
{
    int a = *(const int*) pa;
    int b = *(const int*) pb;
    if (a > b) {
        return -1;
    } else if (a < b) {
        return 1;
    } else {
        return 0;
    }
}

template <typename type>
void mySort(type* ptr, unsigned int n) //n represents size of array pointed to by ptr
{
    qsort(ptr, n, sizeof(ptr[0]), compare2);
    return;
}

上面的代码编译没有任何问题,尽管如果将包含除整数以外的任何内容的数组传递给 mySort() 函数,它在实践中将不起作用。

而下面的代码:

#include <cstdlib>

using namespace std;

template <typename type>
int compare2(const void *pa, const void *pb)
{
    type a = *(const type*) pa;
    type b = *(const type*) pb;
    if (a > b) {
        return -1;
    } else if (a < b) {
        return 1;
    } else {
        return 0;
    }
}

template <typename type>
void mySort(type* ptr, unsigned int n) //n represents size of array pointed to by ptr
{
    qsort(ptr, n, sizeof(ptr[0]), compare2);
    return;
}

编译失败,出现我之前提到的错误。

我知道我可以使用其他方法轻松实现我的目标(例如在给定示例中使用 mySort() 函数内部的排序算法),但我真的很想深入了解这一点。为什么 qsort() 不能使用函数模板作为比较器?是因为我犯了错误还是根本不可能?

compare2 是模板,不是函数。要获得一个函数,编译器必须实例化一个模板。为此,它应该知道模板参数。通常,它们可以从函数参数中推导出来。在目前的情况下,没有推论是可能的,所以你必须通过在模板名称中添加 <type> 来明确:

qsort(ptr, n, sizeof(ptr[0]), compare2<type>);