使用C风格的比较器对数组进行排序

时间:2014-06-09 12:41:14

标签: c++ std

我需要实现一个将从C调用的sort函数。界面看起来像这样(并且,就像我或其他任何人想要改变它一样,我不能):

typedef int (*comparator )(const void*, const void*, void*);
void c_sort(void* ptr, long count, long size, ComparatorFunc comp, void* userData);

我可以用C ++来实现这个功能,但我不能改变界面。我可以看到三件事要做:

  1. 编写我自己的排序功能。这听起来是一个坏主意,因为那时我们负责维护它,并且很难在C或C ++标准库中实现某些东西以及实现,而不花费三周或更长的时间。
  2. 致电qsort。这里的问题是比较器将void *作为第三个参数,这基本上是调用者想要传入以帮助实现比较器的任何东西。
  3. 在函数指针周围使用std :: sort和比较器包装器。这是我最喜欢的选择,因为它看起来比其他三个更容易。
  4. 此外,无论我采用什么实现都需要线程安全,所以我不能为指向userData的指针分配一些静态全局,并使用该全局将userData传递给比较器。

    无论如何,假设3号是我想去的地方(尽管我对其他选项持开放态度),这里是我的问题:我可以很容易地设置一个包装函数指针的仿函数,但我无法想象将void *指针强制转换为什么,以便我可以调用sort。

    template<typename T>
    class ComparatorWrapper
    {
    public:
      ComparatorWrapper(ComparatorFunc comparator, void* userData)
        : comparator_(comparator),
          userData_(userData)
      { }
    
      bool operator()(const T& a, const T& b)
      {
        return comparator_(
          reinterpret_cast<void*>(&a),
          reinterpret_cast<void*>(&b),
          context) < 0;
      }
    
    private:
      ComparatorFunc comparator_;
      void* userData_;
    };
    

    对排序的调用看起来应该是这样的:

    T* foo = reinterpret_cast<T*>(ptr);
    ComparatorWrapper<T> wrapper(comparator, userData);
    std::sort(foo, foo+count, wrapper);
    

    问题在于我不知道T应该是什么。我唯一知道的是sizeof(T) == size。有什么想法吗?

    谢谢!

0 个答案:

没有答案