c++ 如何将std::函数转换为函数指针?

ws51t4hk  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(313)

我需要使用std::qsort()对nd-Point数组进行排序。但是我得到一个错误:
没有已知的从'function〈int(const void *,const void )〉'到'__compar_fn_t'(又称为'int()(const void *,const void *)')的转换'
如何解决它,或排序它的目录在另一种方法?

#include <iostream>
#include <functional>

int d, n;
struct Point {
    int *x;
    Point() : x(new int[d]) {};
};

std::function<int(const void *, const void *)> make_cmp(int dir) {
    return [dir](const void *a, const void *b)->int {
        auto a_ = (Point *)a;
        auto b_ = (Point *)b;
        return a_->x[dir] - b_->x[dir];
    };
}

void sort_points(Point *value, int length, int dir) {
    std::qsort(value, length, sizeof(Point), make_cmp(dir));
}
kr98yfug

kr98yfug1#

如果你必须使用std::qsort,那么你基本上是在用C而不是C++编写。这可能是少数几种全局变量是最不坏的方法的情况之一。

static thread_local int dir;

int cmp(const void *a, const void *b) {
    auto a_ = (const Point *)a;
    auto b_ = (const Point *)b;
    return a_->x[dir] - b_->x[dir]; // beware of overflow
}

void sort_points(Point *value, int length, int d) {
    dir = d;
    std::qsort(value, length, sizeof(Point), cmp);
}

如果一次不会从多个线程调用此函数,则可以删除thread_local
(Note如果值可能超出[INT_MIN/2, INT_MAX/2]范围,则需要用不易溢出的值替换减法。)

相关问题