3

我有一个 C++ 类,但我也在使用一些低级 C 并且需要使用该bsearch函数。的最后一个参数bsearch是一个比较函数,我想以一种允许它访问类的 const 私有变量的方式实现该函数。

问题是,如果我将比较函数设为成员函数,它将无法工作,因为它不能转换为常规函数指针。如果我创建一个非成员函数,我可以将其传递给bsearch,但无法访问该类的私有变量。

该怎么办?

例子: 在此处输入图像描述

3 表示有 3 个元素。16、32、56 是偏移字节。我需要 bsearch 来搜索演员。我在偏移数组中搜索。我需要一个比较函数来比较演员,但我也需要 const void * actorFile用于计算比较函数中位置的指针。actorFIle 是类私有变量。

4

2 回答 2

7

解决方案是放弃 C 库函数,并使用 C++,因为它应该被使用。C++ 标准库还有一个实用程序搜索功能,称为std::lower_bound. 它接受一般的类似函数的对象,而不仅仅是常规的函数指针。

这允许您使用捕获您的类的 lambda 表达式来调用它:

std::lower_bound(start, finish, value, [this] (auto const& lhs, auto const& rhs) {
                 /* Compare and utilize anything this can point to*/ });
于 2017-10-10T07:56:40.107 回答
1

如果您真的bsearch只在非成员函数中使用您的成员函数。因此,您不需要访问私人成员。

/* Create global variable to use in compare proc*/
actors_data_base* cmp_data_base = NULL;

/* Write compare routine like */
int cmp_proc(const void * a, const void * b)
{
    size_t a_offset = static_cast<size_t>(a);
    size_t b_offset = static_cast<size_t>(b);
    return cmp_data_base->compare_actors(a_offset, b_offset);
}


/* Set global pointer and use bsearch */
actors_data_base = &my_data_base;
bsearch(&my_value, array, size, sizeof(size_t), cmp_proc);

当然,由于使用了全局变量,这很丑陋。但这是传递上下文以比较 proc 的唯一方法。您可能会考虑使用线程本地存储来避免线程问题(cmp_proc由于 global var 不能同时使用)

因此,您会更好地使用std::lower_bound.

于 2017-10-10T08:06:03.313 回答