1

我有一个名为反序列化的函数,它作为输入:

int(*cmp)(void*,void*)

因此,该类型的任何函数都可以作为函数的参数。

例如,如果我有这样的 Point 结构:

typedef struct{
    int x, y;
}Point;

现在,为此我的 cmp 函数是这样的:

int point_cmp(void* _p1, void* _p2){
    Point* p1=(Point*)_p1;
    Point* p2=(Point*)_p2;
    return (!((p1->x==p2->x) && (p1->y==p2->y)));
}

这行得通。

但我想为向量做这个。

我想编写一个vector_cmp 函数,它可以像point_cmp 一样传递以进行反序列化。所以,我已经尝试过这样的事情,但它是错误的:

int vector_int_cmp(void* _v1, void* _v2){
    vector<int> *v1 = vector<int> *_v1;
    vector<int> *v2 = vector<int> *_v2;
    auto diff = 0;
    auto v1_it = v1->begin();
    auto v2_it = v2->begin();
    while(v1_it != v1->end() && v2_int != v2->end()){
        if(*v1_it != *v2_it) diff++;
        v1_it++;
        v2_it++;
   } 
   if(0 == diff && (v1_it != v1->end() || v2_it != v2->end())) diff = 1;
   return diff;
}

这样做的正确方法是什么?

4

2 回答 2

4

我想你这样做是为了满足某种外部接口(它将回调你的函数);在纯 C++ 中,永远不需要这样做。无论如何:

int
vector_compare( void const* p1, void const* p2 )
{
    std::vector<int> const* v1 = static_cast<std::vector<int> const*>( p1 );
    std::vector<int> const* v2 = static_cast<std::vector<int> const*>( p2 );
    return *v1 < *v2
        ? -1
        : *v2 < *v1
        ? 1
        : 0;
}

应该是所有必要的。

于 2013-07-31T11:55:46.027 回答
3

直接的问题是你投错了。演员表,如果是 C 风格,应该是这样的:

vector<int> *v1 = (vector<int> *) (_v1);
vector<int> *v2 = (vector<int> *) (_v2);

然后程序编译并运行(一旦你也在循环中更改v2_int为,这是一个错字)。v2_it

更大的问题是你不应该在 C++ 中做类似的事情。void *魔术通常适用于 C,而不是 C++。在 C++ 中,您可以使用模板之类的工具来编写通用代码,并且您应该尽可能依赖标准实现来进行比较操作。毫不奇怪,std::vector有它们 - 尽管当然自己做是一个很好的练习。

于 2013-07-31T11:54:48.420 回答