我需要实现一个将从C调用的sort函数。界面看起来像这样(并且,就像我或其他任何人想要改变它一样,我不能):
typedef int (*comparator )(const void*, const void*, void*);
void c_sort(void* ptr, long count, long size, ComparatorFunc comp, void* userData);
我可以用C ++来实现这个功能,但我不能改变界面。我可以看到三件事要做:
此外,无论我采用什么实现都需要线程安全,所以我不能为指向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
。有什么想法吗?
谢谢!