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>);
我正在尝试创建一个接收数组作为输入并对其进行排序的函数模板。为了对其进行排序,我想我可以使用 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>);