Можно ли использовать функцию qsort () с шаблоном функции в качестве компаратора? - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь создать шаблон функции, который получает массив в качестве входных данных и сортирует его. Чтобы разобраться, я подумал, что мог бы использовать функцию qsort(), которая включена в заголовочный файл cstdlib стандартной библиотеки C ++. Функция 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() будет передан массив, содержащий что-то кроме целых чисел function.

Принимая во внимание, что следующий код:

#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() не работает с шаблоном функции в качестве компаратора? Это из-за ошибки, которую я совершил, или это просто невозможно?

1 Ответ

2 голосов
/ 25 апреля 2020

compare2 - это шаблон, а не функция. Чтобы получить функцию, компилятор должен создать экземпляр шаблона. Для этого нужно знать параметры шаблона. Как правило, они могут быть выведены из параметров функции. В данном случае вычеты невозможны, поэтому вам нужно явно указать добавление <type> к имени шаблона:

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