我有一个名为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;
}
这样做的正确方法是什么?
答案 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
有它们 - 虽然当然做自己的是一个很好的练习。