将void *转换为vector <int> </int>

时间:2013-07-31 11:41:06

标签: c++

我有一个名为deserialize的函数,它作为输入:

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;
}

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

2 个答案:

答案 0 :(得分: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;
}

应该是所有必要的。

答案 1 :(得分: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有它们 - 虽然当然做自己的是一个很好的练习。